FolderSyncAdapter.java 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /**
  2. * Nextcloud Android client application
  3. *
  4. * @author Andy Scherzinger
  5. * Copyright (C) 2016 Andy Scherzinger
  6. * Copyright (C) 2016 Nextcloud
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  10. * License as published by the Free Software Foundation; either
  11. * version 3 of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public
  19. * License along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. package com.owncloud.android.ui.adapter;
  22. import android.content.Context;
  23. import android.graphics.Bitmap;
  24. import android.support.v7.widget.RecyclerView;
  25. import android.view.LayoutInflater;
  26. import android.view.View;
  27. import android.view.ViewGroup;
  28. import android.widget.ImageButton;
  29. import android.widget.ImageView;
  30. import android.widget.LinearLayout;
  31. import android.widget.TextView;
  32. import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter;
  33. import com.owncloud.android.R;
  34. import com.owncloud.android.datamodel.SyncedFolderItem;
  35. import com.owncloud.android.datamodel.ThumbnailsCacheManager;
  36. import com.owncloud.android.lib.common.utils.Log_OC;
  37. import com.owncloud.android.utils.BitmapUtils;
  38. import com.owncloud.android.utils.MimetypeIconUtil;
  39. import java.io.File;
  40. import java.util.ArrayList;
  41. import java.util.List;
  42. /**
  43. * Adapter to display all auto-synced folders and/or instant upload media folders.
  44. */
  45. public class FolderSyncAdapter extends SectionedRecyclerViewAdapter<FolderSyncAdapter.MainViewHolder> {
  46. private static final String TAG = FolderSyncAdapter.class.getSimpleName();
  47. private final Context mContext;
  48. private final int mGridWidth;
  49. private final ClickListener mListener;
  50. private final List<SyncedFolderItem> mSyncFolderItems;
  51. private final RecyclerView mRecyclerView;
  52. public FolderSyncAdapter(Context context, int gridWidth, ClickListener listener, RecyclerView recyclerView) {
  53. mContext = context;
  54. mGridWidth = gridWidth * 2;
  55. mListener = listener;
  56. mSyncFolderItems = new ArrayList<>();
  57. mRecyclerView = recyclerView;
  58. }
  59. public void setSyncFolderItems(List<SyncedFolderItem> syncFolderItems) {
  60. mSyncFolderItems.clear();
  61. mSyncFolderItems.addAll(syncFolderItems);
  62. notifyDataSetChanged();
  63. }
  64. @Override
  65. public int getSectionCount() {
  66. return mSyncFolderItems.size();
  67. }
  68. @Override
  69. public int getItemCount(int section) {
  70. return mSyncFolderItems.get(section).getFilePaths().size();
  71. }
  72. @Override
  73. public void onBindHeaderViewHolder(MainViewHolder holder, final int section) {
  74. holder.title.setText(mSyncFolderItems.get(section).getFolderName());
  75. holder.syncStatusButton.setVisibility(View.VISIBLE);
  76. holder.syncStatusButton.setTag(section);
  77. holder.syncStatusButton.setOnClickListener(new View.OnClickListener() {
  78. @Override
  79. public void onClick(View v) {
  80. mListener.onSyncStatusToggleClick(section, mSyncFolderItems.get(section));
  81. }
  82. });
  83. holder.menuButton.setVisibility(View.VISIBLE);
  84. holder.menuButton.setTag(section);
  85. holder.menuButton.setOnClickListener(new View.OnClickListener() {
  86. @Override
  87. public void onClick(View v) {
  88. mListener.onSyncFolderSettingsClick(section, mSyncFolderItems.get(section));
  89. }
  90. });
  91. }
  92. @Override
  93. public void onBindViewHolder(MainViewHolder holder, int section, int relativePosition, int absolutePosition) {
  94. final Context c = holder.itemView.getContext();
  95. File file = new File(mSyncFolderItems.get(section).getFilePaths().get(relativePosition));
  96. /** Cancellation needs do be checked and done before changing the drawable in fileIcon, or
  97. * {@link ThumbnailsCacheManager#cancelPotentialThumbnailWork} will NEVER cancel any task.
  98. **/
  99. boolean allowedToCreateNewThumbnail = (ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, holder.image));
  100. if (!file.isDirectory()) {
  101. holder.image.setImageResource(R.drawable.file);
  102. } else {
  103. holder.image.setImageResource(R.drawable.ic_menu_archive);
  104. }
  105. // set proper tag
  106. holder.image.setTag(file.hashCode());
  107. // get Thumbnail if file is image
  108. if (BitmapUtils.isImage(file)) {
  109. // Thumbnail in Cache?
  110. Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
  111. String.valueOf(file.hashCode())
  112. );
  113. if (thumbnail != null) {
  114. holder.image.setImageBitmap(thumbnail);
  115. } else {
  116. // generate new Thumbnail
  117. if (allowedToCreateNewThumbnail) {
  118. final ThumbnailsCacheManager.ThumbnailGenerationTask task =
  119. new ThumbnailsCacheManager.ThumbnailGenerationTask(holder.image);
  120. if (thumbnail == null) {
  121. if (BitmapUtils.isVideo(file)) {
  122. thumbnail = ThumbnailsCacheManager.mDefaultVideo;
  123. } else {
  124. thumbnail = ThumbnailsCacheManager.mDefaultImg;
  125. }
  126. }
  127. final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable =
  128. new ThumbnailsCacheManager.AsyncThumbnailDrawable(
  129. mContext.getResources(),
  130. thumbnail,
  131. task
  132. );
  133. holder.image.setImageDrawable(asyncDrawable);
  134. task.execute(file);
  135. Log_OC.v(TAG, "Executing task to generate a new thumbnail");
  136. } // else, already being generated, don't restart it
  137. }
  138. } else {
  139. holder.image.setImageResource(MimetypeIconUtil.getFileTypeIconId(null, file.getName()));
  140. }
  141. if (mSyncFolderItems.get(section).getNumberOfFiles() > 8 && relativePosition >= 8 - 1) {
  142. holder.counterValue.setText(Long.toString(mSyncFolderItems.get(section).getNumberOfFiles() - 8));
  143. holder.counterBar.setVisibility(View.VISIBLE);
  144. holder.thumbnailDarkener.setVisibility(View.VISIBLE);
  145. } else {
  146. holder.counterBar.setVisibility(View.GONE);
  147. holder.thumbnailDarkener.setVisibility(View.GONE);
  148. }
  149. //holder.itemView.setTag(String.format(Locale.getDefault(), "%d:%d:%d", section, relativePos, absolutePos));
  150. //holder.itemView.setOnClickListener(this);
  151. }
  152. @Override
  153. public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  154. View v = LayoutInflater.from(parent.getContext()).inflate(
  155. viewType == VIEW_TYPE_HEADER ?
  156. R.layout.folder_sync_item_header : R.layout.grid_sync_item, parent, false);
  157. return new MainViewHolder(v);
  158. }
  159. public interface ClickListener {
  160. void onSyncStatusToggleClick(int section, SyncedFolderItem syncedFolderItem);
  161. void onSyncFolderSettingsClick(int section, SyncedFolderItem syncedFolderItem);
  162. }
  163. static class MainViewHolder extends RecyclerView.ViewHolder {
  164. final ImageView image;
  165. final TextView title;
  166. final ImageButton menuButton;
  167. final ImageButton syncStatusButton;
  168. final LinearLayout counterBar;
  169. final TextView counterValue;
  170. final ImageView thumbnailDarkener;
  171. public MainViewHolder(View itemView) {
  172. super(itemView);
  173. image = (ImageView) itemView.findViewById(R.id.thumbnail);
  174. title = (TextView) itemView.findViewById(R.id.title);
  175. menuButton = (ImageButton) itemView.findViewById(R.id.settingsButton);
  176. syncStatusButton = (ImageButton) itemView.findViewById(R.id.syncStatusButton);
  177. counterBar = (LinearLayout) itemView.findViewById(R.id.counterLayout);
  178. counterValue = (TextView) itemView.findViewById(R.id.counter);
  179. thumbnailDarkener = (ImageView) itemView.findViewById(R.id.thumbnailDarkener);
  180. }
  181. }
  182. }