FilePermissionHelper.java 9.8 KB

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