From: tobiasKaminsky Date: Sun, 18 Jan 2015 16:00:29 +0000 (+0100) Subject: Merge branch 'develop2' into imageGrid2 X-Git-Tag: oc-android-1.7.0_signed~16^2~21 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/6d5c6f86e5fa9a2edb51562d028554cbc49cdf93?hp=bdb959f2e217c9c0bc28e0c1ba55bf6fb6f632b1 Merge branch 'develop2' into imageGrid2 Conflicts: owncloud-android-library res/layout/list_fragment.xml res/values-fr/strings.xml src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java src/com/owncloud/android/ui/adapter/FileListListAdapter.java src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java src/com/owncloud/android/ui/fragment/ExtendedListFragment.java src/com/owncloud/android/ui/fragment/LocalFileListFragment.java src/com/owncloud/android/ui/fragment/OCFileListFragment.java --- diff --git a/res/drawable-xhdpi/file.png b/res/drawable-xhdpi/file.png new file mode 100644 index 00000000..d249e5f9 Binary files /dev/null and b/res/drawable-xhdpi/file.png differ diff --git a/res/drawable-xhdpi/file_doc.png b/res/drawable-xhdpi/file_doc.png new file mode 100644 index 00000000..a8c10c8b Binary files /dev/null and b/res/drawable-xhdpi/file_doc.png differ diff --git a/res/drawable-xhdpi/file_image.png b/res/drawable-xhdpi/file_image.png new file mode 100644 index 00000000..84b2803d Binary files /dev/null and b/res/drawable-xhdpi/file_image.png differ diff --git a/res/drawable-xhdpi/file_movie.png b/res/drawable-xhdpi/file_movie.png new file mode 100644 index 00000000..bd84c728 Binary files /dev/null and b/res/drawable-xhdpi/file_movie.png differ diff --git a/res/drawable-xhdpi/file_pdf.png b/res/drawable-xhdpi/file_pdf.png new file mode 100644 index 00000000..e2725620 Binary files /dev/null and b/res/drawable-xhdpi/file_pdf.png differ diff --git a/res/drawable-xhdpi/file_ppt.png b/res/drawable-xhdpi/file_ppt.png new file mode 100644 index 00000000..c8988956 Binary files /dev/null and b/res/drawable-xhdpi/file_ppt.png differ diff --git a/res/drawable-xhdpi/file_sound.png b/res/drawable-xhdpi/file_sound.png new file mode 100644 index 00000000..82fbc7b7 Binary files /dev/null and b/res/drawable-xhdpi/file_sound.png differ diff --git a/res/drawable-xhdpi/file_xls.png b/res/drawable-xhdpi/file_xls.png new file mode 100644 index 00000000..2e98d6c0 Binary files /dev/null and b/res/drawable-xhdpi/file_xls.png differ diff --git a/res/drawable-xhdpi/file_zip.png b/res/drawable-xhdpi/file_zip.png new file mode 100644 index 00000000..28130ecd Binary files /dev/null and b/res/drawable-xhdpi/file_zip.png differ diff --git a/res/drawable-xhdpi/folder_public.png b/res/drawable-xhdpi/folder_public.png new file mode 100644 index 00000000..76807125 Binary files /dev/null and b/res/drawable-xhdpi/folder_public.png differ diff --git a/res/drawable-xhdpi/ic_favorite.png b/res/drawable-xhdpi/ic_favorite.png deleted file mode 100644 index c187f0c1..00000000 Binary files a/res/drawable-xhdpi/ic_favorite.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_menu_archive.png b/res/drawable-xhdpi/ic_menu_archive.png new file mode 100644 index 00000000..3ee60288 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_archive.png differ diff --git a/res/drawable-xhdpi/notification_icon.png b/res/drawable-xhdpi/notification_icon.png deleted file mode 100644 index b3855d61..00000000 Binary files a/res/drawable-xhdpi/notification_icon.png and /dev/null differ diff --git a/res/drawable-xhdpi/shared_with_me_folder.png b/res/drawable-xhdpi/shared_with_me_folder.png new file mode 100644 index 00000000..060728c3 Binary files /dev/null and b/res/drawable-xhdpi/shared_with_me_folder.png differ diff --git a/res/layout-land/account_setup.xml b/res/layout-land/account_setup.xml index 88b1ab3c..68625efe 100644 --- a/res/layout-land/account_setup.xml +++ b/res/layout-land/account_setup.xml @@ -32,7 +32,7 @@ android:orientation="horizontal" > + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/grid_item.xml b/res/layout/grid_item.xml new file mode 100644 index 00000000..f04f7fab --- /dev/null +++ b/res/layout/grid_item.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/list_fragment.xml b/res/layout/list_fragment.xml index 160edc1d..570970a6 100644 --- a/res/layout/list_fragment.xml +++ b/res/layout/list_fragment.xml @@ -1,5 +1,5 @@ - +--> + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" > - + android:layout_height="match_parent" + android:columnWidth="100dp" + android:gravity="center" + android:horizontalSpacing="2dp" + android:numColumns="auto_fit" + android:stretchMode="columnWidth" + android:verticalSpacing="2dp" + android:visibility="visible" /> + - - - - - + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center_vertical|center_horizontal" + android:text="@string/empty" + android:visibility="visible" /> - + + \ No newline at end of file diff --git a/res/layout/list_item.xml b/res/layout/list_item.xml index c6c7b92f..78c36cef 100644 --- a/res/layout/list_item.xml +++ b/res/layout/list_item.xml @@ -31,7 +31,7 @@ android:focusableInTouchMode="false"> + android:src="@drawable/shared_with_me" + android:visibility="invisible" /> diff --git a/res/layout/uploader_list_item_layout.xml b/res/layout/uploader_list_item_layout.xml index 1cb93619..08f9ceeb 100644 --- a/res/layout/uploader_list_item_layout.xml +++ b/res/layout/uploader_list_item_layout.xml @@ -30,7 +30,7 @@ android:layout_gravity="center_vertical|center" android:layout_margin="4dp" android:src="@drawable/ic_menu_archive" - android:id="@+id/imageView1" /> + android:id="@+id/thumbnail" /> no blurry images on big screens + int px = mImageViewReference.get().getWidth(); + + if (mFile.isDown()){ + Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile( + mFile.getStoragePath(), px, px); + + if (bitmap != null) { + thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px); + + // Add thumbnail to cache + addBitmapToCache(imageKey, thumbnail); if (mFile instanceof OCFile) { thumbnail = doOCFileInBackground(); diff --git a/src/com/owncloud/android/ui/ExtendedListView.java b/src/com/owncloud/android/ui/ExtendedListView.java index 9fe885bf..c28ff1c3 100644 --- a/src/com/owncloud/android/ui/ExtendedListView.java +++ b/src/com/owncloud/android/ui/ExtendedListView.java @@ -21,18 +21,18 @@ package com.owncloud.android.ui; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; -import android.widget.ListView; +import android.widget.GridView; /** - * ListView allowing to specify the position of an item that should be centered in the visible area, if possible. + * GridView allowing to specify the position of an item that should be top left in the visible area, if possible. * * The cleanest way I found to overcome the problem due to getHeight() returns 0 until the view is really drawn. * * @author David A. Velasco */ -public class ExtendedListView extends ListView { +public class ExtendedListView extends GridView { - private int mPositionToSetAndCenter; + private int mPositionToSetTopLeft; public ExtendedListView(Context context) { super(context); @@ -45,7 +45,7 @@ public class ExtendedListView extends ListView { public ExtendedListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } - + /** * {@inheritDoc} * @@ -54,20 +54,20 @@ public class ExtendedListView extends ListView { @Override protected void onDraw (Canvas canvas) { super.onDraw(canvas); - if (mPositionToSetAndCenter > 0) { - this.setSelectionFromTop(mPositionToSetAndCenter, getHeight() / 2); - mPositionToSetAndCenter = 0; + if (mPositionToSetTopLeft > 0) { + this.smoothScrollToPosition(mPositionToSetTopLeft); + mPositionToSetTopLeft = 0; } } /** - * Public method to set the position of the item that should be centered in the visible area of the view. + * Public method to set the position of the item that should be top left in the visible area of the view. * * The position is saved here and checked in onDraw(). * - * @param position Position (in the list of items) of the item to center in the visible area. + * @param position Position (in the list of items) of the item to be top left in the visible area. */ - public void setAndCenterSelection(int position) { - mPositionToSetAndCenter = position; + public void setSelectionAsTopLeft(int position) { + mPositionToSetTopLeft = position; } } diff --git a/src/com/owncloud/android/ui/SquareImageView.java b/src/com/owncloud/android/ui/SquareImageView.java new file mode 100644 index 00000000..3c909999 --- /dev/null +++ b/src/com/owncloud/android/ui/SquareImageView.java @@ -0,0 +1,25 @@ +package com.owncloud.android.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ImageView; + +public class SquareImageView extends ImageView { + + public SquareImageView(Context context) { + super(context); + } + + public SquareImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, widthMeasureSpec); + } +} diff --git a/src/com/owncloud/android/ui/SquareLinearLayout.java b/src/com/owncloud/android/ui/SquareLinearLayout.java new file mode 100644 index 00000000..a7795d2e --- /dev/null +++ b/src/com/owncloud/android/ui/SquareLinearLayout.java @@ -0,0 +1,25 @@ +package com.owncloud.android.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +public class SquareLinearLayout extends LinearLayout { + + public SquareLinearLayout(Context context) { + super(context); + } + + public SquareLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareLinearLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, widthMeasureSpec); + } +} diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index 9c8c8e1f..ad399762 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -28,15 +28,19 @@ import android.accounts.Account; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.media.ThumbnailUtils; import android.preference.PreferenceManager; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.GridView; import android.widget.ImageView; import android.widget.ListAdapter; -import android.widget.ListView; import android.widget.TextView; import com.owncloud.android.R; @@ -65,12 +69,18 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { private Context mContext; private OCFile mFile = null; private Vector mFiles = null; + private Vector mFilesOrig = new Vector(); private boolean mJustFolders; private FileDataStorageManager mStorageManager; private Account mAccount; private ComponentsGetter mTransferServiceGetter; - + private enum ViewType {LIST_ITEM, GRID_IMAGE, GRID_ITEM }; + private Integer mSortOrder; + public static final Integer SORT_NAME = 0; + public static final Integer SORT_DATE = 1; + public static final Integer SORT_SIZE = 2; + private Boolean mSortAscending; private SharedPreferences mAppPreferences; public FileListListAdapter( @@ -78,11 +88,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { Context context, ComponentsGetter transferServiceGetter ) { - + mJustFolders = justFolders; mContext = context; mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); - mTransferServiceGetter = transferServiceGetter; mAppPreferences = PreferenceManager @@ -95,7 +104,6 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { // initialise thumbnails cache on background thread new ThumbnailsCacheManager.InitDiskCacheTask().execute(); - } @Override @@ -134,78 +142,163 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { + // decide image vs. file view + double countImages = 0; + double countFiles = 0; + + for (OCFile file : mFiles){ + if (!file.isFolder()){ + countFiles++; + + if (file.isImage()){ + countImages++; + } + } + } + + // TODO threshold as constant in Preferences + // > 50% Images --> image view + boolean fileView = true; + if ((countImages / countFiles) >= 0.5){ + fileView = false; + } else { + fileView = true; + } + View view = convertView; - if (view == null) { - LayoutInflater inflator = (LayoutInflater) mContext - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + OCFile file = null; + LayoutInflater inflator = (LayoutInflater) mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + if (mFiles != null && mFiles.size() > position) { + file = mFiles.get(position); + } + + // Find out which layout should be displayed + ViewType viewType; + if (fileView){ + viewType = ViewType.LIST_ITEM; + } else if (file.isImage()){ + viewType = ViewType.GRID_IMAGE; + } else { + viewType = ViewType.GRID_ITEM; + } + + // Create View + switch (viewType){ + case GRID_IMAGE: + view = inflator.inflate(R.layout.grid_image, null); + break; + case GRID_ITEM: + view = inflator.inflate(R.layout.grid_item, null); + break; + case LIST_ITEM: view = inflator.inflate(R.layout.list_item, null); + break; } - - if (mFiles != null && mFiles.size() > position) { - OCFile file = mFiles.get(position); - TextView fileName = (TextView) view.findViewById(R.id.Filename); - String name = file.getFileName(); - - fileName.setText(name); - ImageView fileIcon = (ImageView) view.findViewById(R.id.imageView1); - fileIcon.setTag(file.getFileId()); - ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon); - ImageView sharedWithMeIconV = (ImageView) view.findViewById(R.id.sharedWithMeIcon); - sharedWithMeIconV.setVisibility(View.GONE); - - ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2); - localStateView.bringToFront(); - FileDownloaderBinder downloaderBinder = - mTransferServiceGetter.getFileDownloaderBinder(); - FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); - if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { - localStateView.setImageResource(R.drawable.downloading_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { - localStateView.setImageResource(R.drawable.uploading_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else if (file.isDown()) { - localStateView.setImageResource(R.drawable.local_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else { - localStateView.setVisibility(View.INVISIBLE); - } - - TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); - TextView lastModV = (TextView) view.findViewById(R.id.last_mod); - ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); + + view.invalidate(); + + if (file != null){ + + ImageView fileIcon = (ImageView) view.findViewById(R.id.thumbnail); + TextView fileName; + String name; - if (!file.isFolder()) { - fileSizeV.setVisibility(View.VISIBLE); - fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); + switch (viewType){ + case LIST_ITEM: + fileName = (TextView) view.findViewById(R.id.Filename); + name = file.getFileName(); + fileName.setText(name); + + TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); + TextView lastModV = (TextView) view.findViewById(R.id.last_mod); + ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); + lastModV.setVisibility(View.VISIBLE); lastModV.setText(showRelativeTimestamp(file)); - // this if-else is needed even thoe fav icon is visible by default - // because android reuses views in listview - if (!file.keepInSync()) { - view.findViewById(R.id.imageView3).setVisibility(View.GONE); + + checkBoxV.setVisibility(View.GONE); + + fileSizeV.setVisibility(View.VISIBLE); + fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); + + ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon); + + + if (file.isShareByLink()) { + sharedIconV.setVisibility(View.VISIBLE); } else { - view.findViewById(R.id.imageView3).setVisibility(View.VISIBLE); + sharedIconV.setVisibility(View.GONE); } - ListView parentList = (ListView)parent; - if (parentList.getChoiceMode() == ListView.CHOICE_MODE_NONE) { - checkBoxV.setVisibility(View.GONE); - } else { - if (parentList.isItemChecked(position)) { - checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); + ImageView localStateView = (ImageView) view.findViewById(R.id.localFileIndicator); + + if (!file.isFolder()) { + GridView parentList = (GridView)parent; + if (parentList.getChoiceMode() == GridView.CHOICE_MODE_NONE) { + checkBoxV.setVisibility(View.GONE); } else { - checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); + if (parentList.isItemChecked(position)) { + checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); + } else { + checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); + } + checkBoxV.setVisibility(View.VISIBLE); } - checkBoxV.setVisibility(View.VISIBLE); - } - - // get Thumbnail if file is image + + localStateView.bringToFront(); + FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder(); + FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); + if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { + localStateView.setImageResource(R.drawable.downloading_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { + localStateView.setImageResource(R.drawable.uploading_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else if (file.isDown()) { + localStateView.setImageResource(R.drawable.local_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else { + localStateView.setVisibility(View.INVISIBLE); + } + + ImageView sharedWithMeIconV = (ImageView) view.findViewById(R.id.sharedWithMeIcon); + if (checkIfFileIsSharedWithMe(file)) { + sharedWithMeIconV.setVisibility(View.VISIBLE); + } else { + sharedWithMeIconV.setVisibility(View.GONE); + } + } else { + localStateView.setVisibility(View.INVISIBLE); + } + break; + case GRID_ITEM: + fileName = (TextView) view.findViewById(R.id.Filename); + name = file.getFileName(); + fileName.setText(name); + break; + case GRID_IMAGE: + break; + } + + // For all Views + + // this if-else is needed even though favorite icon is visible by default + // because android reuses views in listview + if (!file.keepInSync()) { + view.findViewById(R.id.favoriteIcon).setVisibility(View.GONE); + } else { + view.findViewById(R.id.favoriteIcon).setVisibility(View.VISIBLE); + } + + // No Folder + if (!file.isFolder()) { if (file.isImage() && file.getRemoteId() != null){ - // Thumbnail in Cache? + // Thumbnail in Cache? Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( String.valueOf(file.getRemoteId()) - ); + ); if (thumbnail != null && !file.needsUpdateThumbnail()){ fileIcon.setImageBitmap(thumbnail); } else { @@ -215,7 +308,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { final ThumbnailsCacheManager.ThumbnailGenerationTask task = new ThumbnailsCacheManager.ThumbnailGenerationTask( fileIcon, mStorageManager, mAccount - ); + ); if (thumbnail == null) { thumbnail = ThumbnailsCacheManager.mDefaultImg; } @@ -224,54 +317,32 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { mContext.getResources(), thumbnail, task - ); + ); fileIcon.setImageDrawable(asyncDrawable); task.execute(file); + } } } else { fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(file.getMimetype(), file.getFileName())); } - - if (checkIfFileIsSharedWithMe(file)) { - sharedWithMeIconV.setVisibility(View.VISIBLE); + else { + fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())); } - } - else { - // TODO Re-enable when server supports folder-size calculation -// if (FileStorageUtils.getDefaultSavePathFor(mAccount.name, file) != null){ -// fileSizeV.setVisibility(View.VISIBLE); -// fileSizeV.setText(getFolderSizeHuman(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file))); -// } else { - fileSizeV.setVisibility(View.INVISIBLE); -// } - - lastModV.setVisibility(View.VISIBLE); - lastModV.setText(showRelativeTimestamp(file)); - checkBoxV.setVisibility(View.GONE); - view.findViewById(R.id.imageView3).setVisibility(View.GONE); - + } else { + // Folder if (checkIfFileIsSharedWithMe(file)) { fileIcon.setImageResource(R.drawable.shared_with_me_folder); - sharedWithMeIconV.setVisibility(View.VISIBLE); + } else if (file.isShareByLink()) { + // If folder is sharedByLink, icon folder must be changed to + // folder-public one + fileIcon.setImageResource(R.drawable.folder_public); } else { fileIcon.setImageResource( DisplayUtils.getFileTypeIconId(file.getMimetype(), file.getFileName()) ); } - - // If folder is sharedByLink, icon folder must be changed to - // folder-public one - if (file.isShareByLink()) { - fileIcon.setImageResource(R.drawable.folder_public); - } - } - - if (file.isShareByLink()) { - sharedIconV.setVisibility(View.VISIBLE); - } else { - sharedIconV.setVisibility(View.GONE); - } + } } return view; @@ -347,6 +418,9 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { } if (mStorageManager != null) { mFiles = mStorageManager.getFolderContent(mFile); + mFilesOrig.clear(); + mFilesOrig.addAll(mFiles); + if (mJustFolders) { mFiles = getFolders(mFiles); } @@ -391,6 +465,96 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { && file.getPermissions().contains(PERMISSION_SHARED_WITH_ME)); } + /** + * Sorts list by Date + * @param sortAscending true: ascending, false: descending + */ + private void sortByDate(boolean sortAscending){ + final Integer val; + if (sortAscending){ + val = 1; + } else { + val = -1; + } + + Collections.sort(mFiles, new Comparator() { + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + Long obj1 = o1.getModificationTimestamp(); + return val * obj1.compareTo(o2.getModificationTimestamp()); + } + else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } else if (o1.getModificationTimestamp() == 0 || o2.getModificationTimestamp() == 0){ + return 0; + } else { + Long obj1 = o1.getModificationTimestamp(); + return val * obj1.compareTo(o2.getModificationTimestamp()); + } + } + }); + } + + /** + * Sorts list by Size + * @param sortAscending true: ascending, false: descending + */ + private void sortBySize(boolean sortAscending){ + final Integer val; + if (sortAscending){ + val = 1; + } else { + val = -1; + } + + Collections.sort(mFiles, new Comparator() { + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + Long obj1 = getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o1))); + return val * obj1.compareTo(getFolderSize(new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, o2)))); + } + else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } else if (o1.getFileLength() == 0 || o2.getFileLength() == 0){ + return 0; + } else { + Long obj1 = o1.getFileLength(); + return val * obj1.compareTo(o2.getFileLength()); + } + } + }); + } + + /** + * Sorts list by Name + * @param sortAscending true: ascending, false: descending + */ + private void sortByName(boolean sortAscending){ + final Integer val; + if (sortAscending){ + val = 1; + } else { + val = -1; + } + + Collections.sort(mFiles, new Comparator() { + public int compare(OCFile o1, OCFile o2) { + if (o1.isFolder() && o2.isFolder()) { + return val * o1.getRemotePath().toLowerCase().compareTo(o2.getRemotePath().toLowerCase()); + } else if (o1.isFolder()) { + return -1; + } else if (o2.isFolder()) { + return 1; + } + return val * new AlphanumComparator().compare(o1, o2); + } + }); + } + public void setSortOrder(Integer order, boolean ascending) { SharedPreferences.Editor editor = mAppPreferences.edit(); editor.putInt("sortOrder", order); @@ -405,6 +569,8 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { notifyDataSetChanged(); } + sortDirectory(); + } private CharSequence showRelativeTimestamp(OCFile file){ return DisplayUtils.getRelativeDateTimeString(mContext, file.getModificationTimestamp(), diff --git a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java index 996851e1..d65c70ed 100644 --- a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -102,7 +102,7 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { String name = file.getName(); fileName.setText(name); - ImageView fileIcon = (ImageView) view.findViewById(R.id.imageView1); + ImageView fileIcon = (ImageView) view.findViewById(R.id.thumbnail); if (!file.isDirectory()) { fileIcon.setImageResource(R.drawable.file); } else { @@ -114,8 +114,7 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { TextView lastModV = (TextView) view.findViewById(R.id.last_mod); ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); if (!file.isDirectory()) { - fileSizeV.setVisibility(View.VISIBLE); - fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.length())); + lastModV.setVisibility(View.VISIBLE); lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.lastModified())); ListView parentList = (ListView)parent; @@ -162,13 +161,16 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { } } else { - fileSizeV.setVisibility(View.GONE); + //fileSizeV.setVisibility(View.GONE); lastModV.setVisibility(View.GONE); checkBoxV.setVisibility(View.GONE); } + fileSizeV.setVisibility(View.VISIBLE); + fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.length())); - view.findViewById(R.id.imageView2).setVisibility(View.INVISIBLE); // not GONE; the alignment would change - view.findViewById(R.id.imageView3).setVisibility(View.GONE); + // not GONE; the alignment changes; ugly way to keep it + view.findViewById(R.id.localFileIndicator).setVisibility(View.INVISIBLE); + view.findViewById(R.id.favoriteIcon).setVisibility(View.GONE); view.findViewById(R.id.sharedIcon).setVisibility(View.GONE); view.findViewById(R.id.sharedWithMeIcon).setVisibility(View.GONE); diff --git a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 1b7a1ddf..def08c51 100644 --- a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -27,6 +27,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; +import android.widget.GridView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; @@ -66,32 +67,42 @@ implements OnItemClickListener, OnEnforceableRefreshListener { private OnEnforceableRefreshListener mOnRefreshListener = null; - + protected GridView imageView; + public void setListAdapter(ListAdapter listAdapter) { - mList.setAdapter(listAdapter); - mList.invalidate(); + imageView.setAdapter(listAdapter); + imageView.invalidate(); } + public GridView getGridView() { + return imageView; + } public void setFooterView(View footer) { mList.addFooterView(footer, null, false); mList.invalidate(); } - public ListView getListView() { - return mList; - } + + protected void switchImageView(){ + imageView.setNumColumns(GridView.AUTO_FIT); + imageView.invalidate(); + } + + protected void switchFileView(){ + imageView.setNumColumns(1); + imageView.invalidate(); + } + + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log_OC.e(TAG, "onCreateView"); View v = inflater.inflate(R.layout.list_fragment, null); - mEmptyListMessage = (TextView) v.findViewById(R.id.empty_list_view); - mList = (ExtendedListView) (v.findViewById(R.id.list_root)); - mList.setOnItemClickListener(this); - - mList.setDivider(getResources().getDrawable(R.drawable.uploader_list_separator)); - mList.setDividerHeight(1); + + imageView = (ExtendedListView)(v.findViewById(R.id.list_root)); + imageView.setOnItemClickListener(this); if (savedInstanceState != null) { int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION); @@ -105,8 +116,6 @@ implements OnItemClickListener, OnEnforceableRefreshListener { onCreateSwipeToRefresh(mRefreshLayout); onCreateSwipeToRefresh(mRefreshEmptyLayout); - mList.setEmptyView(mRefreshEmptyLayout); - return v; } @@ -157,8 +166,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { * screen. */ protected int getReferencePosition() { - if (mList != null) { - return (mList.getFirstVisiblePosition() + mList.getLastVisiblePosition()) / 2; + if (imageView != null) { + return (imageView.getFirstVisiblePosition() + imageView.getLastVisiblePosition()) / 2; } else { return 0; } @@ -171,8 +180,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { * {@link LocalFileListFragment#getReferencePosition()} */ protected void setReferencePosition(int position) { - if (mList != null) { - mList.setAndCenterSelection(position); + if (imageView != null) { + imageView.setSelection(position); } } @@ -190,22 +199,14 @@ implements OnItemClickListener, OnEnforceableRefreshListener { int top = mTops.remove(mTops.size() - 1); - mList.setSelectionFromTop(firstPosition, top); + imageView.smoothScrollToPosition(firstPosition); // Move the scroll if the selection is not visible int indexPosition = mHeightCell*index; - int height = mList.getHeight(); + int height = imageView.getHeight(); if (indexPosition > height) { - if (android.os.Build.VERSION.SDK_INT >= 11) - { - mList.smoothScrollToPosition(index); - } - else if (android.os.Build.VERSION.SDK_INT >= 8) - { - mList.setSelectionFromTop(index, 0); - } - + imageView.smoothScrollToPosition(index); } } } @@ -217,10 +218,10 @@ implements OnItemClickListener, OnEnforceableRefreshListener { mIndexes.add(index); - int firstPosition = mList.getFirstVisiblePosition(); + int firstPosition = imageView.getFirstVisiblePosition(); mFirstPositions.add(firstPosition); - View view = mList.getChildAt(0); + View view = imageView.getChildAt(0); int top = (view == null) ? 0 : view.getTop() ; mTops.add(top); diff --git a/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java index c9408b1e..02a1bfea 100644 --- a/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -76,7 +76,7 @@ public class LocalFileListFragment extends ExtendedListFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log_OC.i(TAG, "onCreateView() start"); View v = super.onCreateView(inflater, container, savedInstanceState); - getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); + getGridView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); disableSwipe(); // Disable pull refresh setMessageForEmptyList(getString(R.string.local_file_list_empty)); Log_OC.i(TAG, "onCreateView() end"); @@ -98,6 +98,20 @@ public class LocalFileListFragment extends ExtendedListFragment { Log_OC.i(TAG, "onActivityCreated() stop"); } + public void selectAll(){ + int numberOfFiles = mAdapter.getCount(); + for(int i = 0; i < numberOfFiles; i++){ + File file = (File) mAdapter.getItem(i); + if (file != null) { + if (!file.isDirectory()) { + /// Click on a file + getGridView().setItemChecked(i, true); + // notify the change to the container Activity + mContainerActivity.onFileClick(file); + } + } + } + } /** * Checks the file clicked over. Browses inside if it is a directory. Notifies the container activity in any case. @@ -118,7 +132,7 @@ public class LocalFileListFragment extends ExtendedListFragment { } else { /// Click on a file ImageView checkBoxV = (ImageView) v.findViewById(R.id.custom_checkbox); if (checkBoxV != null) { - if (getListView().isItemChecked(position)) { + if (getGridView().isItemChecked(position)) { checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); } else { checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); @@ -195,10 +209,10 @@ public class LocalFileListFragment extends ExtendedListFragment { directory = directory.getParentFile(); } - mList.clearChoices(); // by now, only files in the same directory will be kept as selected + imageView.clearChoices(); // by now, only files in the same directory will be kept as selected mAdapter.swapDirectory(directory); if (mDirectory == null || !mDirectory.equals(directory)) { - mList.setSelectionFromTop(0, 0); + imageView.setSelection(0); } mDirectory = directory; } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 9c85dd98..114b048d 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -135,11 +135,11 @@ public class OCFileListFragment extends ExtendedListFragment { mContainerActivity ); setListAdapter(mAdapter); - - registerForContextMenu(getListView()); - getListView().setOnCreateContextMenuListener(this); - } - + + registerForContextMenu(getGridView()); + getGridView().setOnCreateContextMenuListener(this); + } + /** * Saves the current listed folder. */ @@ -389,7 +389,7 @@ public class OCFileListFragment extends ExtendedListFragment { mAdapter.swapDirectory(directory, storageManager); if (mFile == null || !mFile.equals(directory)) { - mList.setSelectionFromTop(0, 0); + imageView.setSelection(0); } mFile = directory; @@ -398,6 +398,31 @@ public class OCFileListFragment extends ExtendedListFragment { Log_OC.d("footer", String.valueOf(System.currentTimeMillis())); footerText.setText(generateFooterText(directory)); Log_OC.d("footer", String.valueOf(System.currentTimeMillis())); + + // decide image vs. file view + double countImages = 0; + double countFiles = 0; + + Vector files = storageManager.getFolderContent(directory); + for (OCFile file : files){ + if (!file.isFolder()){ + countFiles++; + + if (file.isImage()){ + countImages++; + } + } + } + + // > 50% Images --> image view + // TODO threshold as constant in Preferences + if ((countImages / countFiles) >= 0.5){ + Log_OC.i(TAG, "Image View"); + switchImageView(); + } else { + Log_OC.i(TAG, "Folder View"); + switchFileView(); + } } }