ImageRecoverActivity.java 12 KB

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