FolderSyncAdapter.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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(final 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. mSyncFolderItems.get(section).setEnabled(!mSyncFolderItems.get(section).isEnabled());
  82. setSyncButtonActiveIcon(holder.syncStatusButton, mSyncFolderItems.get(section).isEnabled());
  83. }
  84. });
  85. setSyncButtonActiveIcon(holder.syncStatusButton, mSyncFolderItems.get(section).isEnabled());
  86. holder.menuButton.setVisibility(View.VISIBLE);
  87. holder.menuButton.setTag(section);
  88. holder.menuButton.setOnClickListener(new View.OnClickListener() {
  89. @Override
  90. public void onClick(View v) {
  91. mListener.onSyncFolderSettingsClick(section, mSyncFolderItems.get(section));
  92. }
  93. });
  94. }
  95. @Override
  96. public void onBindViewHolder(MainViewHolder holder, int section, int relativePosition, int absolutePosition) {
  97. final Context c = holder.itemView.getContext();
  98. File file = new File(mSyncFolderItems.get(section).getFilePaths().get(relativePosition));
  99. /** Cancellation needs do be checked and done before changing the drawable in fileIcon, or
  100. * {@link ThumbnailsCacheManager#cancelPotentialThumbnailWork} will NEVER cancel any task.
  101. **/
  102. boolean allowedToCreateNewThumbnail = (ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, holder.image));
  103. if (!file.isDirectory()) {
  104. holder.image.setImageResource(R.drawable.file);
  105. } else {
  106. holder.image.setImageResource(R.drawable.ic_menu_archive);
  107. }
  108. // set proper tag
  109. holder.image.setTag(file.hashCode());
  110. // get Thumbnail if file is image
  111. if (BitmapUtils.isImage(file)) {
  112. // Thumbnail in Cache?
  113. Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
  114. String.valueOf(file.hashCode())
  115. );
  116. if (thumbnail != null) {
  117. holder.image.setImageBitmap(thumbnail);
  118. } else {
  119. // generate new Thumbnail
  120. if (allowedToCreateNewThumbnail) {
  121. final ThumbnailsCacheManager.ThumbnailGenerationTask task =
  122. new ThumbnailsCacheManager.ThumbnailGenerationTask(holder.image);
  123. if (thumbnail == null) {
  124. if (BitmapUtils.isVideo(file)) {
  125. thumbnail = ThumbnailsCacheManager.mDefaultVideo;
  126. } else {
  127. thumbnail = ThumbnailsCacheManager.mDefaultImg;
  128. }
  129. }
  130. final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable =
  131. new ThumbnailsCacheManager.AsyncThumbnailDrawable(
  132. mContext.getResources(),
  133. thumbnail,
  134. task
  135. );
  136. holder.image.setImageDrawable(asyncDrawable);
  137. task.execute(file);
  138. Log_OC.v(TAG, "Executing task to generate a new thumbnail");
  139. } // else, already being generated, don't restart it
  140. }
  141. } else {
  142. holder.image.setImageResource(MimetypeIconUtil.getFileTypeIconId(null, file.getName()));
  143. }
  144. if (mSyncFolderItems.get(section).getNumberOfFiles() > 8 && relativePosition >= 8 - 1) {
  145. holder.counterValue.setText(Long.toString(mSyncFolderItems.get(section).getNumberOfFiles() - 8));
  146. holder.counterBar.setVisibility(View.VISIBLE);
  147. holder.thumbnailDarkener.setVisibility(View.VISIBLE);
  148. } else {
  149. holder.counterBar.setVisibility(View.GONE);
  150. holder.thumbnailDarkener.setVisibility(View.GONE);
  151. }
  152. //holder.itemView.setTag(String.format(Locale.getDefault(), "%d:%d:%d", section, relativePos, absolutePos));
  153. //holder.itemView.setOnClickListener(this);
  154. }
  155. @Override
  156. public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  157. View v = LayoutInflater.from(parent.getContext()).inflate(
  158. viewType == VIEW_TYPE_HEADER ?
  159. R.layout.folder_sync_item_header : R.layout.grid_sync_item, parent, false);
  160. return new MainViewHolder(v);
  161. }
  162. public interface ClickListener {
  163. void onSyncStatusToggleClick(int section, SyncedFolderItem syncedFolderItem);
  164. void onSyncFolderSettingsClick(int section, SyncedFolderItem syncedFolderItem);
  165. }
  166. static class MainViewHolder extends RecyclerView.ViewHolder {
  167. final ImageView image;
  168. final TextView title;
  169. final ImageButton menuButton;
  170. final ImageButton syncStatusButton;
  171. final LinearLayout counterBar;
  172. final TextView counterValue;
  173. final ImageView thumbnailDarkener;
  174. public MainViewHolder(View itemView) {
  175. super(itemView);
  176. image = (ImageView) itemView.findViewById(R.id.thumbnail);
  177. title = (TextView) itemView.findViewById(R.id.title);
  178. menuButton = (ImageButton) itemView.findViewById(R.id.settingsButton);
  179. syncStatusButton = (ImageButton) itemView.findViewById(R.id.syncStatusButton);
  180. counterBar = (LinearLayout) itemView.findViewById(R.id.counterLayout);
  181. counterValue = (TextView) itemView.findViewById(R.id.counter);
  182. thumbnailDarkener = (ImageView) itemView.findViewById(R.id.thumbnailDarkener);
  183. }
  184. }
  185. private void setSyncButtonActiveIcon(ImageButton syncStatusButton, boolean enabled) {
  186. if(enabled) {
  187. syncStatusButton.setImageResource(R.drawable.ic_cloud_sync_on);
  188. } else {
  189. syncStatusButton.setImageResource(R.drawable.ic_cloud_sync_off);
  190. }
  191. }
  192. }