From: tobiasKaminsky Date: Tue, 18 Nov 2014 17:08:28 +0000 (+0100) Subject: Merge remote-tracking branch 'upstream/develop' into imageGrid X-Git-Tag: oc-android-1.7.0_signed~16^2~24 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/4867bb32c3a1d4fcafa7b557247f34ef4564fa03?hp=d3bfbb856805d4c988fcfed85d760ba511658da9 Merge remote-tracking branch 'upstream/develop' into imageGrid Conflicts: owncloud-android-library src/com/owncloud/android/ui/adapter/FileListListAdapter.java --- diff --git a/owncloud-android-library b/owncloud-android-library index 2799b3e8..5bd0d738 160000 --- a/owncloud-android-library +++ b/owncloud-android-library @@ -1 +1 @@ -Subproject commit 2799b3e853c79e8ebb37051c92dfcc43f8d63788 +Subproject commit 5bd0d7387712ce3f53869294761ac4d8537841cd diff --git a/res/drawable-hdpi/zzzfehlend/common_error.png b/res/drawable-hdpi/zzzfehlend/common_error.png new file mode 100644 index 00000000..213976c7 Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/common_error.png differ diff --git a/res/drawable-hdpi/zzzfehlend/ic_action_create_dir.png b/res/drawable-hdpi/zzzfehlend/ic_action_create_dir.png new file mode 100644 index 00000000..ece0eb44 Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/ic_action_create_dir.png differ diff --git a/res/drawable-hdpi/zzzfehlend/ic_action_download.png b/res/drawable-hdpi/zzzfehlend/ic_action_download.png new file mode 100644 index 00000000..05e75b4b Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/ic_action_download.png differ diff --git a/res/drawable-hdpi/zzzfehlend/ic_action_refresh.png b/res/drawable-hdpi/zzzfehlend/ic_action_refresh.png new file mode 100644 index 00000000..e6212cf6 Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/ic_action_refresh.png differ diff --git a/res/drawable-hdpi/zzzfehlend/ic_action_refresh_black.png b/res/drawable-hdpi/zzzfehlend/ic_action_refresh_black.png new file mode 100644 index 00000000..e6212cf6 Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/ic_action_refresh_black.png differ diff --git a/res/drawable-hdpi/zzzfehlend/ic_action_settings.png b/res/drawable-hdpi/zzzfehlend/ic_action_settings.png new file mode 100644 index 00000000..999d0f0d Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/ic_action_settings.png differ diff --git a/res/drawable-hdpi/zzzfehlend/ic_action_upload.png b/res/drawable-hdpi/zzzfehlend/ic_action_upload.png new file mode 100644 index 00000000..2369348c Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/ic_action_upload.png differ diff --git a/res/drawable-hdpi/zzzfehlend/image_fail.png b/res/drawable-hdpi/zzzfehlend/image_fail.png new file mode 100644 index 00000000..38667417 Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/image_fail.png differ diff --git a/res/drawable-hdpi/zzzfehlend/logo.png b/res/drawable-hdpi/zzzfehlend/logo.png new file mode 100644 index 00000000..188d693a Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/logo.png differ diff --git a/res/drawable-hdpi/zzzfehlend/winter_holidays_icon.png b/res/drawable-hdpi/zzzfehlend/winter_holidays_icon.png new file mode 100644 index 00000000..c1764b6d Binary files /dev/null and b/res/drawable-hdpi/zzzfehlend/winter_holidays_icon.png differ 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 4236d070..564404af 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" /> Mémoriser l\'emplacement de partage Mémoriser le dernier emplacement d\'upload Essayez %1$s sur votre smartphone ! - J'aimerais vous inviter à utiliser %1$s sur votre smartphone ! + J\'aimerais vous inviter à utiliser %1$s sur votre smartphone ! Téléchargez-le ici : %2$s Vérifier le serveur Adresse du serveur https://… @@ -51,7 +51,7 @@ Téléchargez-le ici : %2$s Fichiers Connecter Téléverser - Sélectionner le dossier d'envoi : + Sélectionner le dossier d\'envoi : Aucun compte n\'a été trouvé Aucun compte %1$s n\'a été trouvé. Veuillez commencer par en configurer un. Paramètres @@ -61,7 +61,7 @@ Téléchargez-le ici : %2$s %1$s n\'est pas autorisé à accéder au contenu partagé Téléversement il y a quelques secondes - Il n'y a rien ici ! Envoyez donc quelque chose :) + Il n\'y a rien ici ! Envoyez donc quelque chose :) Chargement… Aucun fichier n\'est présent dans ce dossier. Effleurez un fichier pour afficher les informations complémentaires @@ -178,7 +178,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Nom d\'utilisateur ou mot de passe incorrect Échec d\'autorisation Accès refusé par le serveur d\'autorisation - État inattendu ; veuillez entrer à nouveau l'URL du serveur + État inattendu ; veuillez entrer à nouveau l\'URL du serveur Votre autorisation a expiré. Merci de vous authentifier à nouveau Veuillez saisir le mot de passe courant Votre session a expiré. Merci de vous reconnecter @@ -224,7 +224,7 @@ Ci-dessous la liste des fichiers locaux, et les fichiers distants dans %5$s auxq Masquer Délivré à : Délivré par : - Nom d'usage : + Nom d\'usage : Organisation : Unité organisationnelle : Pays : diff --git a/src/com/owncloud/android/MainApp.java b/src/com/owncloud/android/MainApp.java index c2a4c68b..ca59cb31 100644 --- a/src/com/owncloud/android/MainApp.java +++ b/src/com/owncloud/android/MainApp.java @@ -19,6 +19,26 @@ package com.owncloud.android; import android.app.Application; import android.content.Context; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.ThumbnailsCacheManager; +import android.app.Application; +import android.content.Context; + +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.ThumbnailsCacheManager; +import android.app.Application; +import android.content.Context; + +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.datamodel.ThumbnailsCacheManager; +import android.app.Application; +import android.content.Context; + +import com.owncloud.android.datamodel.ThumbnailsCacheManager; +import android.app.Application; +import android.content.Context; + +import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy; diff --git a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 1d2cda8c..52bb3a76 100644 --- a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -59,7 +59,7 @@ public class ThumbnailsCacheManager { private static final String TAG = ThumbnailsCacheManager.class.getSimpleName(); private static final String CACHE_FOLDER = "thumbnailCache"; - private static final String MINOR_SERVER_VERSION_FOR_THUMBS = "7.8.0"; + private static final String MINOR_SERVER_VERSION_FOR_THUMBS = "6.8.0"; private static final Object mThumbnailsDiskCacheLock = new Object(); private static DiskLruImageCache mThumbnailCache = null; @@ -205,10 +205,8 @@ public class ThumbnailsCacheManager { // Not found in disk cache if (thumbnail == null || mFile.needsUpdateThumbnail()) { - // Converts dp to pixel - Resources r = MainApp.getAppContext().getResources(); - - int px = (int) Math.round(r.getDimension(R.dimen.file_icon_size)); + // Use Width of imageView -> no blurry images on big screens + int px = mImageViewReference.get().getWidth(); if (mFile.isDown()){ Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile( @@ -278,9 +276,7 @@ public class ThumbnailsCacheManager { final ThumbnailGenerationTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (this == bitmapWorkerTask && imageView != null) { - if (imageView.getTag().equals(mFile.getFileId())) { - imageView.setImageBitmap(bitmap); - } + imageView.setImageBitmap(bitmap); } } } 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 10356320..c2f70e8d 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; @@ -67,11 +71,13 @@ 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; @@ -84,11 +90,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { Context context, ComponentsGetter transferServiceGetter ) { - + mJustFolders = justFolders; mContext = context; mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); - mTransferServiceGetter = transferServiceGetter; mAppPreferences = PreferenceManager @@ -101,7 +106,6 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { // initialise thumbnails cache on background thread new ThumbnailsCacheManager.InitDiskCacheTask().execute(); - } @Override @@ -140,144 +144,201 @@ 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); + view.invalidate(); - 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); + 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 { + 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); + } + + 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 { - checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); + localStateView.setVisibility(View.INVISIBLE); } - checkBoxV.setVisibility(View.VISIBLE); - } - - // get Thumbnail if file is image + + 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 { // generate new Thumbnail if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) { - final ThumbnailsCacheManager.ThumbnailGenerationTask task = + final ThumbnailsCacheManager.ThumbnailGenerationTask task = new ThumbnailsCacheManager.ThumbnailGenerationTask( fileIcon, mStorageManager, mAccount - ); + ); if (thumbnail == null) { thumbnail = ThumbnailsCacheManager.mDefaultImg; } final AsyncDrawable asyncDrawable = new AsyncDrawable( - mContext.getResources(), - thumbnail, + mContext.getResources(), + thumbnail, task - ); + ); fileIcon.setImageDrawable(asyncDrawable); task.execute(file); + } } - } else { - fileIcon.setImageResource( - DisplayUtils.getResourceId(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 { - fileIcon.setImageResource( - DisplayUtils.getResourceId(file.getMimetype(), file.getFileName()) - ); - } - - // If folder is sharedByLink, icon folder must be changed to - // folder-public one - if (file.isShareByLink()) { + } 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.getResourceId(file.getMimetype(), file.getFileName())); } - } - - if (file.isShareByLink()) { - sharedIconV.setVisibility(View.VISIBLE); - } else { - sharedIconV.setVisibility(View.GONE); - } + } } return view; @@ -353,6 +414,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); } @@ -515,7 +579,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { mSortAscending = ascending; 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 6190ebee..8fcec5c3 100644 --- a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -99,7 +99,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 { @@ -110,8 +110,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; @@ -127,13 +126,15 @@ 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 changes; ugly way to keep it - view.findViewById(R.id.imageView3).setVisibility(View.GONE); + view.findViewById(R.id.localFileIndicator).setVisibility(View.INVISIBLE); // not GONE; the alignment changes; ugly way to keep it + 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 5d3f7ace..9e251c79 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,14 +67,25 @@ 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 ListView getListView() { - return mList; + public GridView getGridView() { + return imageView; + } + + protected void switchImageView(){ + imageView.setNumColumns(GridView.AUTO_FIT); + imageView.invalidate(); + } + + protected void switchFileView(){ + imageView.setNumColumns(1); + imageView.invalidate(); } @@ -82,12 +94,17 @@ implements OnItemClickListener, OnEnforceableRefreshListener { 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); + +// imageView = (GridView) v.findViewById(R.id.grid_list_view); +// imageView.setOnItemClickListener(this); + + // mEmptyListMessage = (TextView) v.findViewById(R.id.empty_list_view); + imageView = (ExtendedListView)(v.findViewById(R.id.list_root)); + imageView.setOnItemClickListener(this); - mList.setDivider(getResources().getDrawable(R.drawable.uploader_list_separator)); - mList.setDividerHeight(1); + //mList.set + //mList.setDivider(getResources().getDrawable(R.drawable.uploader_list_separator)); + //mList.setDividerHeight(1); if (savedInstanceState != null) { int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION); @@ -101,7 +118,7 @@ implements OnItemClickListener, OnEnforceableRefreshListener { onCreateSwipeToRefresh(mRefreshLayout); onCreateSwipeToRefresh(mRefreshEmptyLayout); - mList.setEmptyView(mRefreshEmptyLayout); +// mList.setEmptyView(mRefreshEmptyLayout); return v; } @@ -152,8 +169,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { * @return The position in the list of the visible item in the center of the 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; } @@ -166,8 +183,8 @@ implements OnItemClickListener, OnEnforceableRefreshListener { * @param position Reference position previously returned by {@link LocalFileListFragment#getReferencePosition()} */ protected void setReferencePosition(int position) { - if (mList != null) { - mList.setAndCenterSelection(position); + if (imageView != null) { + imageView.setSelection(position); } } @@ -185,22 +202,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); } } } @@ -212,10 +221,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 62b41a3e..e954f027 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"); @@ -105,7 +105,7 @@ public class LocalFileListFragment extends ExtendedListFragment { if (file != null) { if (!file.isDirectory()) { /// Click on a file - getListView().setItemChecked(i, true); + getGridView().setItemChecked(i, true); // notify the change to the container Activity mContainerActivity.onFileClick(file); } @@ -138,7 +138,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); @@ -215,10 +215,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 0b1059fc..dc96ca00 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -18,6 +18,7 @@ package com.owncloud.android.ui.fragment; import java.io.File; +import java.util.Vector; import android.app.Activity; import android.content.Intent; @@ -126,8 +127,8 @@ public class OCFileListFragment extends ExtendedListFragment { ); setListAdapter(mAdapter); - registerForContextMenu(getListView()); - getListView().setOnCreateContextMenuListener(this); + registerForContextMenu(getGridView()); + getGridView().setOnCreateContextMenuListener(this); } /** @@ -381,9 +382,34 @@ public class OCFileListFragment extends ExtendedListFragment { mAdapter.swapDirectory(directory, storageManager); if (mFile == null || !mFile.equals(directory)) { - mList.setSelectionFromTop(0, 0); + imageView.setSelection(0); } mFile = directory; + + // 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(); + } } }