From: tobiasKaminsky Date: Wed, 5 Nov 2014 21:07:11 +0000 (+0100) Subject: Merge remote-tracking branch 'upstream/develop' into imageGrid X-Git-Tag: oc-android-1.7.0_signed~16^2~28 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/f331120a147b95e7a27fb765de2e210d4af892ca?hp=--cc Merge remote-tracking branch 'upstream/develop' into imageGrid Conflicts: owncloud-android-library res/layout/list_item.xml src/com/owncloud/android/ui/adapter/FileListListAdapter.java src/com/owncloud/android/ui/fragment/LocalFileListFragment.java --- f331120a147b95e7a27fb765de2e210d4af892ca diff --cc owncloud-android-library index 00000000,4f315c7e..5bd0d738 mode 000000,160000..160000 --- a/owncloud-android-library +++ b/owncloud-android-library @@@ -1,0 -1,1 +1,1 @@@ -Subproject commit 4f315c7e06f6eef48df246be0ee9252fdfccdf00 ++Subproject commit 5bd0d7387712ce3f53869294761ac4d8537841cd diff --cc res/layout/list_item.xml index 2d7ab87b,c6c7b92f..78c36cef --- a/res/layout/list_item.xml +++ b/res/layout/list_item.xml @@@ -31,17 -31,17 +31,17 @@@ android:focusableInTouchMode="false"> diff --cc src/com/owncloud/android/MainApp.java index 08efe342,c2a4c68b..4fdc5cb8 --- a/src/com/owncloud/android/MainApp.java +++ b/src/com/owncloud/android/MainApp.java @@@ -16,11 -16,13 +16,33 @@@ */ package com.owncloud.android; - import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; - import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy; + 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; + import com.owncloud.android.lib.common.utils.Log_OC; /** * Main Application of the project * @@@ -53,7 -55,20 +75,20 @@@ public class MainApp extends Applicatio } else { OwnCloudClientManagerFactory.setDefaultPolicy(Policy.ALWAYS_NEW_CLIENT); } + + // initialise thumbnails cache on background thread - new ThumbnailsCacheManager.InitDiskCacheTask().execute(); ++ new ThumbnailsCacheManager.InitDiskCacheTask(mContext).execute(); + if (BuildConfig.DEBUG) { + + String dataFolder = getDataFolder(); + + // Set folder for store logs + Log_OC.setLogDataFolder(dataFolder); + + Log_OC.startLogging(); + Log_OC.d("Debug", "start logging"); + } } public static Context getAppContext() { diff --cc src/com/owncloud/android/ui/adapter/FileListListAdapter.java index 00d045a6,e002efb7..d2680fa5 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@@ -17,13 -17,18 +17,24 @@@ */ package com.owncloud.android.ui.adapter; + + import java.io.File; + import java.util.Collections; + import java.util.Comparator; import java.util.Vector; + import third_parties.daveKoeller.AlphanumComparator; import android.accounts.Account; import android.content.Context; ++<<<<<<< HEAD +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.media.ThumbnailUtils; ++======= + import android.content.SharedPreferences; + import android.graphics.Bitmap; + import android.preference.PreferenceManager; ++>>>>>>> upstream/develop import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@@ -42,8 -48,8 +55,13 @@@ import com.owncloud.android.files.servi import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; import com.owncloud.android.ui.activity.ComponentsGetter; import com.owncloud.android.utils.DisplayUtils; ++<<<<<<< HEAD +import com.owncloud.android.utils.Log_OC; + ++======= + import com.owncloud.android.utils.FileStorageUtils; + ++>>>>>>> upstream/develop /** * This Adapter populates a ListView with all files and folders in an ownCloud @@@ -63,7 -70,12 +82,16 @@@ public class FileListListAdapter extend private FileDataStorageManager mStorageManager; private Account mAccount; private ComponentsGetter mTransferServiceGetter; ++<<<<<<< HEAD + 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; ++>>>>>>> upstream/develop public FileListListAdapter( boolean justFolders, @@@ -112,172 -138,148 +154,280 @@@ @Override public View getView(int position, View convertView, ViewGroup parent) { + // decide image vs. file view + double count = 0; + + + for (OCFile file : mFiles){ + if (file.isImage()){ + count++; + } + } + + // TODO threshold as constant in Preferences + // > 50% Images --> image view + boolean fileView = true; + if ((count / mFiles.size()) >= 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; } ++<<<<<<< HEAD + + view.invalidate(); + + if (file != null){ + + ImageView fileIcon = (ImageView) view.findViewById(R.id.thumbnail); + TextView fileName; + String name; ++======= + + 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); ++>>>>>>> upstream/develop - if (!file.isFolder()) { + 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); ++<<<<<<< HEAD + lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); + + checkBoxV.setVisibility(View.GONE); + fileSizeV.setVisibility(View.VISIBLE); fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); - lastModV.setVisibility(View.VISIBLE); + + ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon); + + + if (file.isShareByLink()) { + sharedIconV.setVisibility(View.VISIBLE); ++======= + lastModV.setText( + DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()) + ); + // 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); ++>>>>>>> upstream/develop } 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); + } ++<<<<<<< HEAD + + 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 { - checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); + 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.isDown()){ + Bitmap bitmap = BitmapFactory.decodeFile(file.getStoragePath()); + fileIcon.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap, 200, 200)); + } else { + fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype(), file.getFileName())); + } + } else { + // Folder ++======= + checkBoxV.setVisibility(View.VISIBLE); + } + + // get Thumbnail if file is image + if (file.isImage() && file.getRemoteId() != null){ + // 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 = + new ThumbnailsCacheManager.ThumbnailGenerationTask( + fileIcon, mStorageManager, mAccount + ); + if (thumbnail == null) { + thumbnail = ThumbnailsCacheManager.mDefaultImg; + } + final AsyncDrawable asyncDrawable = new AsyncDrawable( + 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 { + // 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( + DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()) + ); + checkBoxV.setVisibility(View.GONE); + view.findViewById(R.id.imageView3).setVisibility(View.GONE); + ++>>>>>>> upstream/develop 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.getResourceId(file.getMimetype(), file.getFileName())); + fileIcon.setImageResource( + DisplayUtils.getResourceId(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; diff --cc src/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 17c3d010,5d3f7ace..c6123483 --- a/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/src/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@@ -64,27 -64,16 +65,27 @@@ implements OnItemClickListener, OnEnfor private ArrayList mTops; private int mHeightCell = 0; - private SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = null; + 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(); } diff --cc src/com/owncloud/android/ui/fragment/LocalFileListFragment.java index c695733d,62b41a3e..90af004c --- a/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@@ -209,16 -230,18 +230,18 @@@ public class LocalFileListFragment exte * @return File paths to the files checked by the user. */ public String[] getCheckedFilePaths() { - String [] result = null; + ArrayList result = new ArrayList(); - SparseBooleanArray positions = mList.getCheckedItemPositions(); + SparseBooleanArray positions = imageView.getCheckedItemPositions(); if (positions.size() > 0) { - Log_OC.d(TAG, "Returning " + positions.size() + " selected files"); - result = new String[positions.size()]; - for (int i=0; i files = storageManager.getFolderContent(directory); + for (OCFile file : files){ + if (file.isImage()){ + count++; + } + } + + // > 50% Images --> image view + // TODO threshold as constant in Preferences + if ((count / files.size()) >= 0.5){ + Log_OC.i(TAG, "Image View"); + switchImageView(); + } else { + Log_OC.i(TAG, "Folder View"); + switchFileView(); + } } } + + public void sortByName(boolean descending) { + mAdapter.setSortOrder(FileListListAdapter.SORT_NAME, descending); + } + + public void sortByDate(boolean descending) { + mAdapter.setSortOrder(FileListListAdapter.SORT_DATE, descending); + } + + public void sortBySize(boolean descending) { + mAdapter.setSortOrder(FileListListAdapter.SORT_SIZE, descending); + } }