FilePermissionHelper.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package com.datarecovery.master.utils;
  2. import android.os.Build;
  3. import android.text.TextUtils;
  4. import android.view.Gravity;
  5. import androidx.activity.ComponentActivity;
  6. import androidx.lifecycle.Lifecycle;
  7. import androidx.lifecycle.LifecycleEventObserver;
  8. import androidx.lifecycle.LifecycleOwner;
  9. import com.atmob.common.runtime.ContextUtil;
  10. import com.datarecovery.master.R;
  11. import com.datarecovery.master.data.consts.EventId;
  12. import com.datarecovery.master.data.repositories.AccountRepository;
  13. import com.datarecovery.master.dialog.PermissionDialog;
  14. import com.datarecovery.master.handler.EventHelper;
  15. import com.datarecovery.master.module.login.LoginActivity;
  16. import com.datarecovery.master.module.member.MemberType;
  17. import com.datarecovery.master.utils.xfile.XFilePermission;
  18. import atmob.reactivex.rxjava3.annotations.NonNull;
  19. import atmob.reactivex.rxjava3.core.Single;
  20. import atmob.reactivex.rxjava3.core.SingleObserver;
  21. import atmob.reactivex.rxjava3.core.SingleSource;
  22. import atmob.reactivex.rxjava3.disposables.Disposable;
  23. import atmob.reactivex.rxjava3.functions.Function;
  24. import atmob.rxjava.utils.RxJavaUtil;
  25. public class FilePermissionHelper {
  26. Disposable disposable;
  27. public void requestDataFilePermission(ComponentActivity activity, @MemberType String memberType, boolean isSkipLogin, NextStepCallback stepCallback) {
  28. Single.just(Build.VERSION.SDK_INT)
  29. .flatMap(sdkInt -> {
  30. if (isSkipLogin) {
  31. return Single.just(sdkInt);
  32. }
  33. if (TextUtils.isEmpty(AccountRepository.token)) {
  34. return (SingleSource<Integer>) observer -> activity.runOnUiThread(() -> {
  35. PermissionDialog loginDialog = new PermissionDialog(activity);
  36. loginDialog.setDialogContent(R.string.dialog_no_login)
  37. .setDialogTitle(R.string.dialog_no_login_title)
  38. .setOnDialogClickListener(new PermissionDialog.OnDialogClickListener() {
  39. @Override
  40. public void onClickSure() {
  41. LoginActivity.start(activity, ReportUtil.getReportId(memberType));
  42. activity.getLifecycle().addObserver(new LifecycleEventObserver() {
  43. @Override
  44. public void onStateChanged(@androidx.annotation.NonNull LifecycleOwner lifecycleOwner, @androidx.annotation.NonNull Lifecycle.Event event) {
  45. if (event == Lifecycle.Event.ON_RESUME) {
  46. if (!TextUtils.isEmpty(AccountRepository.token)) {
  47. loginDialog.dismiss();
  48. activity.getLifecycle().removeObserver(this);
  49. observer.onSuccess(sdkInt);
  50. }
  51. } else if (event == Lifecycle.Event.ON_DESTROY) {
  52. activity.getLifecycle().removeObserver(this);
  53. }
  54. }
  55. });
  56. }
  57. @Override
  58. public void onClickCancel() {
  59. observer.onError(new CancelException());
  60. }
  61. });
  62. loginDialog.show();
  63. });
  64. } else {
  65. return Single.just(sdkInt);
  66. }
  67. })
  68. .flatMap((Function<Integer, SingleSource<Integer>>) sdkInt -> {
  69. //判断是否有所有文件权限
  70. boolean result = PermissionUtil.hasFilePermission();
  71. if (!result) {
  72. return (SingleSource<Integer>) observer -> activity.runOnUiThread(() -> {
  73. PermissionDialog requestManageDialog = new PermissionDialog(activity);
  74. requestManageDialog.setDialogTitle(R.string.request_manage_permission_title)
  75. .setDialogContent(R.string.request_manage_permission_content)
  76. .setTitleGravity(Gravity.START)
  77. .setContentGravity(Gravity.START)
  78. .setSureText(R.string.teaching_limit)
  79. .setOnDialogClickListener(new PermissionDialog.OnDialogClickListener() {
  80. @Override
  81. public void onClickSure() {
  82. EventHelper.report(EventId.hf1000402);
  83. PermissionUtil.requestWriteStoragePermission(activity, new PermissionUtil.PermissionCallback() {
  84. @Override
  85. public void onPermissionGranted() {
  86. requestManageDialog.dismiss();
  87. observer.onSuccess(sdkInt);
  88. }
  89. @Override
  90. public void onPermissionDenied() {
  91. }
  92. });
  93. }
  94. @Override
  95. public void onClickCancel() {
  96. EventHelper.report(EventId.hf1000401);
  97. observer.onError(new CancelException());
  98. }
  99. });
  100. requestManageDialog.show();
  101. });
  102. } else {
  103. return Single.just(sdkInt);
  104. }
  105. })
  106. .flatMap((Function<Integer, SingleSource<Integer>>) sdkInt -> {
  107. if (sdkInt >= Build.VERSION_CODES.TIRAMISU) {
  108. return Single.just(sdkInt);
  109. }
  110. boolean dataFolder = XFilePermission.hasAndroidDataPermission(ContextUtil.getContext());
  111. if (!dataFolder) {
  112. return observer -> activity.runOnUiThread(() -> {
  113. PermissionDialog requestAndroidDataDialog = new PermissionDialog(activity);
  114. requestAndroidDataDialog.setDialogTitle(R.string.request_android_data_permission_title)
  115. .setDialogContent(R.string.request_android_data_permission_content)
  116. .setCancelText(R.string.wait_moment)
  117. .setSureText(R.string.teaching_limit)
  118. .setOnDialogClickListener(new PermissionDialog.OnDialogClickListener() {
  119. @Override
  120. public void onClickSure() {
  121. EventHelper.report(EventId.hf1000404);
  122. XFilePermission.requestAndroidDataPermission(activity, new XFilePermission.PermissionCallback() {
  123. @Override
  124. public void onPermissionGranted() {
  125. requestAndroidDataDialog.dismiss();
  126. observer.onSuccess(sdkInt);
  127. }
  128. @Override
  129. public void onPermissionDenied() {
  130. }
  131. });
  132. }
  133. @Override
  134. public void onClickCancel() {
  135. EventHelper.report(EventId.hf1000403);
  136. observer.onError(new CancelException());
  137. }
  138. });
  139. requestAndroidDataDialog.show();
  140. });
  141. } else {
  142. return Single.just(sdkInt);
  143. }
  144. })
  145. .compose(RxJavaUtil.SingleSchedule.io2Main())
  146. .subscribe(new SingleObserver<Integer>() {
  147. @Override
  148. public void onSubscribe(@NonNull Disposable d) {
  149. disposable = d;
  150. }
  151. @Override
  152. public void onSuccess(@NonNull Integer sdkInt) {
  153. if (stepCallback != null) stepCallback.onNextStep();
  154. }
  155. @Override
  156. public void onError(@NonNull Throwable e) {
  157. if (e instanceof CancelException) {
  158. if (stepCallback != null) stepCallback.onCancel();
  159. }
  160. }
  161. });
  162. activity.getLifecycle().addObserver(new LifecycleEventObserver() {
  163. @Override
  164. public void onStateChanged(@androidx.annotation.NonNull LifecycleOwner lifecycleOwner, @androidx.annotation.NonNull Lifecycle.Event event) {
  165. if (event == Lifecycle.Event.ON_DESTROY) {
  166. if (disposable != null && !disposable.isDisposed()) {
  167. disposable.dispose();
  168. }
  169. activity.getLifecycle().removeObserver(this);
  170. }
  171. }
  172. });
  173. }
  174. public interface NextStepCallback {
  175. void onNextStep();
  176. void onCancel();
  177. }
  178. private static class CancelException extends Exception {
  179. }
  180. }