ImageGridFragment.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package epson.print.imgsel;
  2. import android.annotation.TargetApi;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.os.AsyncTask;
  7. import android.os.Build;
  8. import android.os.Bundle;
  9. import android.support.p000v4.app.Fragment;
  10. import android.util.Log;
  11. import android.view.LayoutInflater;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.view.ViewTreeObserver;
  15. import android.widget.AdapterView;
  16. import android.widget.GridView;
  17. import android.widget.ListAdapter;
  18. import epson.common.Constants;
  19. import epson.print.R;
  20. import epson.print.ImageItem;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. public class ImageGridFragment extends Fragment implements AdapterView.OnItemClickListener {
  24. private static final String ARG_PHOTO_FOLDER_PATH = "photo_folder_path";
  25. public static final int DIALOG_CODE_NOTIFY = 3;
  26. public static final int PHOTO_SELECTION_MODE_DEFAULT = 0;
  27. public static final int PHOTO_SELECTION_MODE_MULTISELECT = 1;
  28. public static final int PHOTO_SELECTION_MODE_ZOOM = 0;
  29. private static final int REQUEST_CODE_IMAGE_PAGER = 2;
  30. private Alt2ViewImageAdapter mAdapter;
  31. private boolean mDoubleClickGuard;
  32. private GridView mGridView;
  33. private ImageFindTask mImageFindTask;
  34. private ImageSelector mImageSelector;
  35. private ImageThumbnailTask mImageThumbnailTask;
  36. private String mPhotoFolderPath;
  37. private int mPhotoSelectionMode = 0;
  38. public interface ImageGridListener {
  39. ImageFinder getImageFinder();
  40. ImageSelector getImageSelector();
  41. }
  42. public static ImageGridFragment newInstance(String str) {
  43. ImageGridFragment imageGridFragment = new ImageGridFragment();
  44. Bundle bundle = new Bundle();
  45. bundle.putString(ARG_PHOTO_FOLDER_PATH, str);
  46. imageGridFragment.setArguments(bundle);
  47. return imageGridFragment;
  48. }
  49. protected static SharedPreferences getPreferences(Context context) {
  50. return context.getSharedPreferences(Constants.PREFS_PHOTO, 0);
  51. }
  52. public int getPhotoSelectionMode() {
  53. return this.mPhotoSelectionMode;
  54. }
  55. public void setPhotoSelectionMode(int i) {
  56. this.mPhotoSelectionMode = i;
  57. SharedPreferences.Editor edit = getPreferences(getActivity()).edit();
  58. edit.putInt(Constants.PHOTO_SELECT_MODE, this.mPhotoSelectionMode);
  59. edit.commit();
  60. }
  61. public void onCreate(Bundle bundle) {
  62. super.onCreate(bundle);
  63. if (getArguments() != null) {
  64. this.mPhotoFolderPath = getArguments().getString(ARG_PHOTO_FOLDER_PATH);
  65. }
  66. this.mPhotoSelectionMode = getPreferences(getActivity()).getInt(Constants.PHOTO_SELECT_MODE, 0);
  67. }
  68. public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
  69. View inflate = layoutInflater.inflate(R.layout.fragment_image_grid, viewGroup, false);
  70. this.mGridView = (GridView) inflate.findViewById(R.id.gridView);
  71. this.mAdapter = new Alt2ViewImageAdapter(this);
  72. this.mGridView.setAdapter(this.mAdapter);
  73. this.mGridView.setOnItemClickListener(this);
  74. this.mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new MyGridLayoutListener(this.mGridView, this.mAdapter, getActivity().getResources().getDimensionPixelSize(R.dimen.image_selector_grid_thumbnail_spacing)));
  75. this.mImageSelector = ((ImageGridListener) getActivity()).getImageSelector();
  76. getActivity().invalidateOptionsMenu();
  77. restartImageFindTask();
  78. return inflate;
  79. }
  80. public void onActivityCreated(Bundle bundle) {
  81. super.onActivityCreated(bundle);
  82. }
  83. public void onItemClick(AdapterView<?> adapterView, View view, int i, long j) {
  84. Alt2ViewImageAdapter alt2ViewImageAdapter = this.mAdapter;
  85. if (alt2ViewImageAdapter != null && !this.mDoubleClickGuard) {
  86. int i2 = 1;
  87. this.mDoubleClickGuard = true;
  88. ImageItem imageItem = alt2ViewImageAdapter.getImageItem(i);
  89. if (imageItem == null || this.mImageSelector == null) {
  90. this.mDoubleClickGuard = false;
  91. return;
  92. }
  93. ImageSelectActivity imageSelectActivity = (ImageSelectActivity) getActivity();
  94. if (this.mPhotoSelectionMode != 1 || imageSelectActivity.singleImageMode()) {
  95. startViewPagerActivity(i);
  96. } else if (imageItem.getSelected() != 0 || this.mImageSelector.canAdd()) {
  97. this.mImageSelector.toggleSelect(imageItem.getPath());
  98. if (imageItem.getSelected() != 0) {
  99. i2 = 0;
  100. }
  101. imageItem.setSelected(i2);
  102. this.mAdapter.notifyDataSetChanged();
  103. getActivity().invalidateOptionsMenu();
  104. } else {
  105. try {
  106. LocalAlertDialogFragment.newInstance(getString(R.string.max_image), 3).show(getChildFragmentManager(), "alert dialog");
  107. } catch (IllegalStateException unused) {
  108. }
  109. this.mDoubleClickGuard = false;
  110. return;
  111. }
  112. this.mDoubleClickGuard = false;
  113. }
  114. }
  115. public void onDestroy() {
  116. super.onDestroy();
  117. }
  118. public void onDetach() {
  119. super.onDetach();
  120. Log.d("ImageGridFragment", "onDetach()");
  121. ImageFindTask imageFindTask = this.mImageFindTask;
  122. if (imageFindTask != null) {
  123. imageFindTask.cancel(true);
  124. this.mImageFindTask = null;
  125. }
  126. ImageThumbnailTask imageThumbnailTask = this.mImageThumbnailTask;
  127. if (imageThumbnailTask != null) {
  128. imageThumbnailTask.cancel(true);
  129. this.mImageThumbnailTask = null;
  130. }
  131. Alt2ViewImageAdapter alt2ViewImageAdapter = this.mAdapter;
  132. if (alt2ViewImageAdapter != null) {
  133. alt2ViewImageAdapter.recycleBitmap();
  134. this.mAdapter = null;
  135. this.mGridView.setAdapter((ListAdapter) null);
  136. }
  137. FragmentActivity activity = getActivity();
  138. if (activity != null) {
  139. activity.invalidateOptionsMenu();
  140. }
  141. }
  142. private void startViewPagerActivity(int i) {
  143. Alt2ViewImageAdapter alt2ViewImageAdapter = this.mAdapter;
  144. if (alt2ViewImageAdapter != null && this.mImageSelector != null) {
  145. ArrayList<String> fileList = alt2ViewImageAdapter.getFileList();
  146. ImageSelectActivity imageSelectActivity = (ImageSelectActivity) getActivity();
  147. if (imageSelectActivity != null) {
  148. Intent intent = new Intent(imageSelectActivity, imageSelectActivity.showNfcInvalidMessageOnPagerActivity() ? ImageViewPagerWithNfcInvalidPrintMessageActivity.class : ImageViewPagerActivity.class);
  149. intent.putExtra(ImageViewPagerActivity.PARAMS_KEY_POSITION, i);
  150. intent.putExtra(ImageViewPagerActivity.PARAMS_KEY_SELECTOR, this.mImageSelector.getFileArrayList());
  151. intent.putExtra(ImageViewPagerActivity.PARAMS_SINGLE_FILE_MODE, imageSelectActivity.singleImageMode());
  152. intent.putExtra(ImageViewPagerActivity.PARAMS_MESSAGE_TYPE, imageSelectActivity.getMessageType());
  153. ImageViewPagerActivity.setFileList(fileList);
  154. startActivityForResult(intent, 2);
  155. }
  156. }
  157. }
  158. public void goNext() {
  159. ((ImageSelectActivity) getActivity()).goNext();
  160. }
  161. public void updateImageSelector(ArrayList<String> arrayList) {
  162. if (arrayList != null) {
  163. this.mImageSelector.replaceFiles(arrayList);
  164. Alt2ViewImageAdapter alt2ViewImageAdapter = this.mAdapter;
  165. if (alt2ViewImageAdapter != null) {
  166. int count = alt2ViewImageAdapter.getCount();
  167. for (int i = 0; i < count; i++) {
  168. ImageItem imageItem = this.mAdapter.getImageItem(i);
  169. imageItem.setSelected(this.mImageSelector.isSelected(imageItem.getPath()) ? 1 : 0);
  170. }
  171. this.mAdapter.notifyDataSetChanged();
  172. }
  173. FragmentActivity activity = getActivity();
  174. if (activity != null) {
  175. activity.invalidateOptionsMenu();
  176. }
  177. }
  178. }
  179. public void onActivityResult(int i, int i2, Intent intent) {
  180. if (i == 2) {
  181. ArrayList<String> stringArrayListExtra = intent.getStringArrayListExtra(ImageViewPagerActivity.RETURN_KEY_SELECTOR);
  182. if (stringArrayListExtra != null) {
  183. updateImageSelector(stringArrayListExtra);
  184. }
  185. if (i2 == 10) {
  186. goNext();
  187. }
  188. }
  189. }
  190. public void onResume() {
  191. super.onResume();
  192. this.mDoubleClickGuard = false;
  193. ImageThumbnailTask imageThumbnailTask = this.mImageThumbnailTask;
  194. if (imageThumbnailTask != null) {
  195. imageThumbnailTask.setSuspend(false);
  196. }
  197. }
  198. public void onPause() {
  199. super.onPause();
  200. ImageThumbnailTask imageThumbnailTask = this.mImageThumbnailTask;
  201. if (imageThumbnailTask != null) {
  202. imageThumbnailTask.setSuspend(true);
  203. }
  204. }
  205. private void restartImageFindTask() {
  206. ImageGridListener imageGridListener = (ImageGridListener) getActivity();
  207. if (imageGridListener != null) {
  208. this.mImageFindTask = new ImageFindTask(this, this.mPhotoFolderPath);
  209. this.mImageFindTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new ImageFinder[]{imageGridListener.getImageFinder()});
  210. this.mImageThumbnailTask = new ImageThumbnailTask(this);
  211. }
  212. }
  213. public boolean isImageSelected(String str) {
  214. return this.mImageSelector.isSelected(str);
  215. }
  216. public String getFolderName() {
  217. return this.mPhotoFolderPath;
  218. }
  219. public void addItem(List<ImageItem> list) {
  220. if (list != null && this.mAdapter != null && this.mImageThumbnailTask != null) {
  221. for (ImageItem next : list) {
  222. this.mAdapter.add(next);
  223. this.mImageThumbnailTask.addLast(next);
  224. }
  225. this.mAdapter.notifyDataSetChanged();
  226. if (this.mImageThumbnailTask.getStatus() == AsyncTask.Status.PENDING) {
  227. this.mImageThumbnailTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Void[0]);
  228. }
  229. }
  230. }
  231. public void updateItem(ImageItem imageItem) {
  232. Alt2ViewImageAdapter alt2ViewImageAdapter;
  233. int position;
  234. if (imageItem != null && (alt2ViewImageAdapter = this.mAdapter) != null && this.mGridView != null && (position = alt2ViewImageAdapter.getPosition(imageItem)) != -1) {
  235. this.mAdapter.getImageItem(position).setBitmap(imageItem.getBitmap());
  236. int firstVisiblePosition = this.mGridView.getFirstVisiblePosition();
  237. int lastVisiblePosition = this.mGridView.getLastVisiblePosition();
  238. if (firstVisiblePosition <= position && lastVisiblePosition >= position) {
  239. this.mAdapter.notifyDataSetChanged();
  240. }
  241. }
  242. }
  243. public void updateData() {
  244. Alt2ViewImageAdapter alt2ViewImageAdapter = this.mAdapter;
  245. if (alt2ViewImageAdapter != null && this.mGridView != null && this.mImageThumbnailTask != null) {
  246. alt2ViewImageAdapter.notifyDataSetChanged();
  247. this.mImageThumbnailTask.setFinish(true);
  248. }
  249. }
  250. public void changeThumnailPriority(ImageItem imageItem) {
  251. ImageThumbnailTask imageThumbnailTask = this.mImageThumbnailTask;
  252. if (imageThumbnailTask != null) {
  253. imageThumbnailTask.moveToFirst(imageItem);
  254. }
  255. }
  256. public void clearItem() {
  257. Alt2ViewImageAdapter alt2ViewImageAdapter = this.mAdapter;
  258. if (alt2ViewImageAdapter != null) {
  259. alt2ViewImageAdapter.clearImageItem();
  260. this.mAdapter.notifyDataSetChanged();
  261. }
  262. }
  263. private static class MyGridLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
  264. Alt2ViewImageAdapter mAdapter;
  265. private GridView mGridView;
  266. private int mHorizontalSpacing;
  267. public MyGridLayoutListener(GridView gridView, Alt2ViewImageAdapter alt2ViewImageAdapter, int i) {
  268. this.mGridView = gridView;
  269. this.mAdapter = alt2ViewImageAdapter;
  270. this.mHorizontalSpacing = i;
  271. }
  272. @TargetApi(16)
  273. public void onGlobalLayout() {
  274. int numColumns = this.mGridView.getNumColumns();
  275. if (numColumns <= 0) {
  276. return;
  277. }
  278. if (Build.VERSION.SDK_INT >= 16) {
  279. setNewVerticalParams();
  280. this.mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
  281. return;
  282. }
  283. int width = this.mGridView.getWidth();
  284. int i = this.mHorizontalSpacing;
  285. this.mAdapter.setHeight(((width + i) / numColumns) - i);
  286. this.mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
  287. }
  288. @TargetApi(16)
  289. private void setNewVerticalParams() {
  290. this.mGridView.setVerticalSpacing(this.mGridView.getHorizontalSpacing());
  291. this.mAdapter.setHeight(this.mGridView.getColumnWidth());
  292. }
  293. }
  294. }