ImageRecoverActivity.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package com.datarecovery.master.module.imgrecover;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.view.KeyEvent;
  8. import androidx.annotation.NonNull;
  9. import androidx.annotation.Nullable;
  10. import androidx.recyclerview.widget.ConcatAdapter;
  11. import androidx.recyclerview.widget.GridLayoutManager;
  12. import androidx.recyclerview.widget.LinearLayoutManager;
  13. import androidx.recyclerview.widget.RecyclerView;
  14. import com.atmob.app.lib.base.BaseActivity;
  15. import com.datarecovery.master.R;
  16. import com.datarecovery.master.databinding.ActivityImageRecoverBinding;
  17. import com.datarecovery.master.databinding.ItemMainTabLayoutBinding;
  18. import com.datarecovery.master.databinding.ItemTabImageRecoverBinding;
  19. import com.datarecovery.master.dialog.CommonLoadingDialog;
  20. import com.datarecovery.master.dialog.CommonSureDialog;
  21. import com.datarecovery.master.dialog.ScanProgressDialog;
  22. import com.datarecovery.master.module.preview.PreviewActivity;
  23. import com.datarecovery.master.utils.BoxingUtil;
  24. import com.datarecovery.master.utils.GridLayoutItemDecoration;
  25. import com.datarecovery.master.utils.GridRecoverItemDecoration;
  26. import com.datarecovery.master.utils.ImageDeepDetector;
  27. import com.google.android.material.tabs.TabLayout;
  28. import com.gyf.immersionbar.ImmersionBar;
  29. import dagger.hilt.android.AndroidEntryPoint;
  30. @AndroidEntryPoint
  31. public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBinding> implements ImageItemAdapter.onItemClick {
  32. ImageRecoverViewModel imageRecoverViewModel;
  33. private final int[] tabTitle = {R.string.photo, R.string.wx, R.string.qq, R.string.other};
  34. private CommonSureDialog backDialog;
  35. private CommonLoadingDialog loadingDialog;
  36. private ScanProgressDialog scanProgressDialog;
  37. private ImageItemAdapter photoAdapter;
  38. private ImageItemAdapter wxAdapter;
  39. private ImageItemAdapter qqAdapter;
  40. private ImageItemAdapter otherAdapter;
  41. private GridLayoutManager gridLayoutManager;
  42. public static void start(Context context) {
  43. Intent intent = new Intent(context, ImageRecoverActivity.class);
  44. if (!(context instanceof Activity)) {
  45. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  46. }
  47. context.startActivity(intent);
  48. }
  49. @Override
  50. protected void onCreate(@Nullable Bundle savedInstanceState) {
  51. super.onCreate(savedInstanceState);
  52. initView();
  53. initObserver();
  54. }
  55. private void initView() {
  56. binding.toolBar.setNavigationOnClickListener(v -> onBackPressed());
  57. addTopStatusBarHeight(binding.toolBar);
  58. initRecycleView();
  59. initTabLayout();
  60. }
  61. private void initRecycleView() {
  62. ImageTitleAdapter photoTitleAdapter = new ImageTitleAdapter(this, imageRecoverViewModel.getDetectedPhotoTitle());
  63. photoAdapter = new ImageItemAdapter(ImageDeepDetector.ImageFile.CATEGORY_GALLERY, this);
  64. photoAdapter.setOnItemClick(this);
  65. ImageTitleAdapter wxTitleAdapter = new ImageTitleAdapter(this, imageRecoverViewModel.getDetectedWxTitle());
  66. wxAdapter = new ImageItemAdapter(ImageDeepDetector.ImageFile.CATEGORY_WECHAT, this);
  67. wxAdapter.setOnItemClick(this);
  68. ImageTitleAdapter qqTitleAdapter = new ImageTitleAdapter(this, imageRecoverViewModel.getDetectedQQTitle());
  69. qqAdapter = new ImageItemAdapter(ImageDeepDetector.ImageFile.CATEGORY_QQ, this);
  70. qqAdapter.setOnItemClick(this);
  71. ImageTitleAdapter otherTitleAdapter = new ImageTitleAdapter(this, imageRecoverViewModel.getDetectedOtherTitle());
  72. otherAdapter = new ImageItemAdapter(ImageDeepDetector.ImageFile.CATEGORY_OTHER, this);
  73. otherAdapter.setOnItemClick(this);
  74. ConcatAdapter concatAdapter = new ConcatAdapter(
  75. photoTitleAdapter,
  76. photoAdapter,
  77. wxTitleAdapter,
  78. wxAdapter,
  79. qqTitleAdapter,
  80. qqAdapter,
  81. otherTitleAdapter,
  82. otherAdapter
  83. );
  84. binding.ryImageRecover.setAdapter(concatAdapter);
  85. gridLayoutManager = new GridLayoutManager(this, 3);
  86. gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
  87. @Override
  88. public int getSpanSize(int position) {
  89. if (position == getPhotoPosition() || position == getWxPosition() || position == getQQPosition() || position == getOtherPosition()) {
  90. return 3;
  91. }
  92. return 1;
  93. }
  94. });
  95. binding.ryImageRecover.addItemDecoration(new GridRecoverItemDecoration(3, 0.0282222222222222f, 0.0202222222222222f));
  96. binding.ryImageRecover.setLayoutManager(gridLayoutManager);
  97. RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
  98. @Override
  99. public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
  100. int firstVisibleItem = gridLayoutManager.findFirstVisibleItemPosition();
  101. int lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition();
  102. int photoPosition = getPhotoPosition();
  103. int wxPosition = getWxPosition();
  104. int qqPosition = getQQPosition();
  105. int otherPosition = getOtherPosition();
  106. if (firstVisibleItem == photoPosition || (firstVisibleItem >= photoPosition && lastVisibleItem < wxPosition)) {
  107. binding.tabLayout.selectTab(binding.tabLayout.getTabAt(0));
  108. } else if (firstVisibleItem == wxPosition || (firstVisibleItem >= wxPosition && lastVisibleItem < qqPosition)) {
  109. binding.tabLayout.selectTab(binding.tabLayout.getTabAt(1));
  110. } else if (firstVisibleItem == qqPosition || (firstVisibleItem >= qqPosition && lastVisibleItem < otherPosition)) {
  111. binding.tabLayout.selectTab(binding.tabLayout.getTabAt(2));
  112. } else if (firstVisibleItem >= otherPosition) {
  113. binding.tabLayout.selectTab(binding.tabLayout.getTabAt(3));
  114. }
  115. }
  116. };
  117. binding.ryImageRecover.addOnScrollListener(onScrollListener);
  118. }
  119. public int getPhotoPosition() {
  120. return 0;
  121. }
  122. public int getWxPosition() {
  123. return getPhotoPosition() + photoAdapter.getItemCount() + 1;
  124. }
  125. public int getQQPosition() {
  126. return getWxPosition() + wxAdapter.getItemCount() + 1;
  127. }
  128. public int getOtherPosition() {
  129. return getQQPosition() + qqAdapter.getItemCount() + 1;
  130. }
  131. @Override
  132. public void onCheck(ImageDeepDetector.ImageFile imageFile) {
  133. if (imageFile == null) {
  134. return;
  135. }
  136. imageRecoverViewModel.setItemCheck(imageFile);
  137. }
  138. @Override
  139. public void onItemClick(ImageDeepDetector.ImageFile imageFile) {
  140. imageRecoverViewModel.checkPreview(imageFile);
  141. }
  142. private void initTabLayout() {
  143. binding.tabLayout.removeAllTabs();
  144. binding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
  145. @SuppressLint("UseCompatLoadingForDrawables")
  146. @Override
  147. public void onTabSelected(TabLayout.Tab tab) {
  148. if (tab.getCustomView() == null) {
  149. return;
  150. }
  151. ItemTabImageRecoverBinding itemBinding = ItemTabImageRecoverBinding.bind(tab.getCustomView());
  152. itemBinding.tabTitle.setTextColor(getResources().getColor(com.atmob.app.base.R.color.white));
  153. itemBinding.tabTitle.setBackground(getResources().getDrawable(R.drawable.bg_tab_selected));
  154. }
  155. @Override
  156. public void onTabUnselected(TabLayout.Tab tab) {
  157. if (tab.getCustomView() == null) {
  158. return;
  159. }
  160. ItemTabImageRecoverBinding itemBinding = ItemTabImageRecoverBinding.bind(tab.getCustomView());
  161. itemBinding.tabTitle.setTextColor(getResources().getColor(R.color.tab_un_select_text_color));
  162. itemBinding.tabTitle.setBackground(null);
  163. }
  164. @Override
  165. public void onTabReselected(TabLayout.Tab tab) {
  166. }
  167. });
  168. for (int i = 0; i < tabTitle.length; i++) {
  169. TabLayout.Tab tab = binding.tabLayout.newTab();
  170. ItemTabImageRecoverBinding tabLayoutBinding = ItemTabImageRecoverBinding.inflate(getLayoutInflater());
  171. int finalI = i;
  172. tabLayoutBinding.getRoot().setOnClickListener(v -> {
  173. switch (finalI) {
  174. case 0:
  175. gridLayoutManager.scrollToPositionWithOffset(getPhotoPosition(), 0);
  176. break;
  177. case 1:
  178. gridLayoutManager.scrollToPositionWithOffset(getWxPosition(), 0);
  179. break;
  180. case 2:
  181. gridLayoutManager.scrollToPositionWithOffset(getQQPosition(), 0);
  182. break;
  183. case 3:
  184. gridLayoutManager.scrollToPositionWithOffset(getOtherPosition(), 0);
  185. break;
  186. }
  187. binding.tabLayout.selectTab(binding.tabLayout.getTabAt(finalI));
  188. });
  189. tabLayoutBinding.tabTitle.setText(tabTitle[i]);
  190. tab.setCustomView(tabLayoutBinding.getRoot());
  191. binding.tabLayout.addTab(tab);
  192. }
  193. }
  194. private void initObserver() {
  195. imageRecoverViewModel.getFinishEvent().observe(this, o -> finish());
  196. imageRecoverViewModel.getShowScanDialogEvent().observe(this, this::showScanProgressDialog);
  197. imageRecoverViewModel.getDetectedPhotoImg().observe(this, list -> photoAdapter.submit(list));
  198. imageRecoverViewModel.getDetectedWxImg().observe(this, list -> wxAdapter.submit(list));
  199. imageRecoverViewModel.getDetectedQQImg().observe(this, list -> qqAdapter.submit(list));
  200. imageRecoverViewModel.getDetectedOtherImg().observe(this, list -> otherAdapter.submit(list));
  201. imageRecoverViewModel.getDetectedFinish().observe(this, o -> scanProgressDialog.detectedFinish());
  202. imageRecoverViewModel.getPreviewEvent().observe(this, uri -> PreviewActivity.start(this, PreviewActivity.TYPE_IMG, uri));
  203. imageRecoverViewModel.getShowLoadingEvent().observe(this, this::showLoadingDialog);
  204. }
  205. private void showBackDialog() {
  206. if (backDialog == null) {
  207. backDialog = new CommonSureDialog(this);
  208. backDialog.setDialogTitle(R.string.img_recovery_back_title)
  209. .setDialogContent(R.string.img_recovery_back_content)
  210. .setOnDialogClickListener(this::finish);
  211. }
  212. backDialog.show();
  213. }
  214. @Override
  215. protected void configImmersion(@NonNull ImmersionBar immersionBar) {
  216. immersionBar.statusBarDarkFont(true);
  217. }
  218. public void showScanProgressDialog(Boolean show) {
  219. if (BoxingUtil.boxing(show)) {
  220. if (scanProgressDialog == null) {
  221. scanProgressDialog = new ScanProgressDialog(this, imageRecoverViewModel.getTotalDetectedCount());
  222. scanProgressDialog.setOnCancelListener(() -> imageRecoverViewModel.cancelScan());
  223. }
  224. scanProgressDialog.show();
  225. } else {
  226. if (scanProgressDialog != null) {
  227. scanProgressDialog.dismiss();
  228. }
  229. }
  230. }
  231. public void showLoadingDialog(Boolean show) {
  232. if (BoxingUtil.boxing(show)) {
  233. if (loadingDialog == null) {
  234. loadingDialog = new CommonLoadingDialog(this);
  235. }
  236. loadingDialog.show();
  237. } else {
  238. if (loadingDialog != null) {
  239. loadingDialog.dismiss();
  240. }
  241. }
  242. }
  243. @Override
  244. public void onBackPressed() {
  245. showBackDialog();
  246. }
  247. @Override
  248. public boolean onKeyDown(int keyCode, KeyEvent event) {
  249. if (keyCode == KeyEvent.KEYCODE_BACK) {
  250. onBackPressed();
  251. return true;
  252. }
  253. return super.onKeyDown(keyCode, event);
  254. }
  255. @Override
  256. protected void onDestroy() {
  257. super.onDestroy();
  258. binding.tabLayout.clearOnTabSelectedListeners();
  259. }
  260. @Override
  261. protected boolean shouldImmersion() {
  262. return true;
  263. }
  264. @Override
  265. protected void initViewModel() {
  266. super.initViewModel();
  267. imageRecoverViewModel = getViewModelProvider().get(ImageRecoverViewModel.class);
  268. binding.setImageRecoverViewModel(imageRecoverViewModel);
  269. }
  270. }