diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/FileActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/FileActivity.java index bfea87257..f34dffc06 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/FileActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/FileActivity.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.ui.activity; -import android.Manifest; import android.content.Intent; import android.net.Uri; @@ -11,9 +10,9 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.databinding.ActivityFileBinding; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.presenter.FilePresenter; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.ResUtil; import com.github.catvod.utils.Path; -import com.permissionx.guolindev.PermissionX; import java.io.File; @@ -38,16 +37,16 @@ public class FileActivity extends BaseActivity implements FilePresenter.OnClickL checkPermission(); } - private void checkPermission() { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> update(Path.root())); - } - private void setRecyclerView() { mBinding.recycler.setHasFixedSize(true); mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(new FilePresenter(this)))); } + private void checkPermission() { + PermissionUtil.requestFile(this, allGranted -> update(Path.root())); + } + private void update(File dir) { mBinding.recycler.setSelectedPosition(0); mAdapter.setItems(Path.list(this.dir = dir), null); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index ae5956eab..5a979e581 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -21,7 +21,6 @@ import com.bumptech.glide.request.target.Target; import com.fongmi.android.tv.App; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.R; -import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.Updater; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; @@ -40,7 +39,6 @@ import com.fongmi.android.tv.event.CastEvent; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.event.ServerEvent; import com.fongmi.android.tv.impl.Callback; -import com.fongmi.android.tv.impl.ChainTask; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.server.Server; @@ -59,11 +57,11 @@ import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.FileChooser; import com.fongmi.android.tv.utils.KeyUtil; import com.fongmi.android.tv.utils.Notify; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; import com.google.common.collect.Lists; -import com.permissionx.guolindev.PermissionX; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -107,9 +105,9 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen mClock = Clock.create(mBinding.clock).format("HH:mm:ss"); mBinding.progressLayout.showProgress(); Updater.create().release().start(this); + PermissionUtil.requestNotify(this); mResult = Result.empty(); Server.get().start(); - requestPermission(); setRecyclerView(); setViewModel(); setAdapter(); @@ -141,12 +139,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen } } - private void requestPermission() { - PermissionX.init(this).permissions(PermissionX.permission.POST_NOTIFICATIONS).request((allGranted, grantedList, deniedList) -> { - if (Setting.hasFileManager()) PermissionX.init(this).permissions().requestManageExternalStoragePermissionNow(new ChainTask()); - }); - } - private void setRecyclerView() { CustomSelector selector = new CustomSelector(); selector.addPresenter(Integer.class, new HeaderPresenter()); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 481acadde..8d9d31a4f 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.ui.activity; -import android.Manifest; import android.app.Activity; import android.content.Intent; import android.view.View; @@ -38,11 +37,11 @@ import com.fongmi.android.tv.ui.dialog.SiteDialog; import com.fongmi.android.tv.utils.FileChooser; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Notify; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.ResUtil; import com.github.catvod.bean.Doh; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Path; -import com.permissionx.guolindev.PermissionX; import java.util.ArrayList; import java.util.List; @@ -129,8 +128,8 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit @Override public void setConfig(Config config) { - if (config.getUrl().startsWith("file") && !PermissionX.isGranted(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> load(config)); + if (config.getUrl().startsWith("file")) { + PermissionUtil.requestFile(this, allGranted -> load(config)); } else { load(config); } @@ -319,7 +318,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit } private void onBackup(View view) { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.backup(new Callback() { + PermissionUtil.requestFile(this, allGranted -> AppDatabase.backup(new Callback() { @Override public void success() { Notify.show(R.string.backup_success); @@ -333,7 +332,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit } private void onRestore(View view) { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> RestoreDialog.create(this).show(new Callback() { + PermissionUtil.requestFile(this, allGranted -> RestoreDialog.create(getActivity()).show(new Callback() { @Override public void success() { Notify.show(R.string.restore_success); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 5be86b542..d8f654300 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.ui.activity; -import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; @@ -77,13 +76,13 @@ import com.fongmi.android.tv.utils.FileChooser; import com.fongmi.android.tv.utils.ImgUtil; import com.fongmi.android.tv.utils.KeyUtil; import com.fongmi.android.tv.utils.Notify; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Sniffer; import com.fongmi.android.tv.utils.Traffic; import com.fongmi.android.tv.utils.Util; import com.github.bassaer.library.MDColor; import com.github.catvod.utils.Trans; -import com.permissionx.guolindev.PermissionX; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -146,7 +145,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List public static void file(FragmentActivity activity, String path) { if (TextUtils.isEmpty(path)) return; String name = new File(path).getName(); - PermissionX.init(activity).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> start(activity, "push_agent", "file://" + path, name)); + PermissionUtil.requestFile(activity, allGranted -> start(activity, "push_agent", "file://" + path, name)); } public static void cast(Activity activity, History history) { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java index 3ffd1eebf..3e584f44b 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.ui.custom; -import android.Manifest; import android.content.Context; import android.content.Intent; import android.graphics.PorterDuff; @@ -17,9 +16,9 @@ import androidx.fragment.app.FragmentActivity; import com.fongmi.android.tv.R; import com.fongmi.android.tv.utils.KeyUtil; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.ResUtil; import com.github.bassaer.library.MDColor; -import com.permissionx.guolindev.PermissionX; public class CustomMic extends AppCompatImageView { @@ -49,16 +48,6 @@ public class CustomMic extends AppCompatImageView { this.activity = activity; } - private void checkPermission() { - if (PermissionX.isGranted(activity, Manifest.permission.RECORD_AUDIO)) { - start(); - } else { - PermissionX.init(activity).permissions(Manifest.permission.RECORD_AUDIO).request((allGranted, grantedList, deniedList) -> { - if (allGranted) start(); - }); - } - } - private void startListening() { try { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); @@ -95,8 +84,10 @@ public class CustomMic extends AppCompatImageView { @Override protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); - if (gainFocus) checkPermission(); - else stop(); + if (!gainFocus) stop(); + else PermissionUtil.requestAudio(activity, allGranted -> { + if (allGranted) start(); + }); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/impl/ChainTask.java b/app/src/main/java/com/fongmi/android/tv/impl/ChainTask.java deleted file mode 100644 index 1927ffe1e..000000000 --- a/app/src/main/java/com/fongmi/android/tv/impl/ChainTask.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fongmi.android.tv.impl; - -import com.permissionx.guolindev.request.ExplainScope; -import com.permissionx.guolindev.request.ForwardScope; - -import java.util.List; - -public class ChainTask implements com.permissionx.guolindev.request.ChainTask { - - @Override - public ExplainScope getExplainScope() { - return null; - } - - @Override - public ForwardScope getForwardScope() { - return null; - } - - @Override - public void request() { - } - - @Override - public void requestAgain(List permissions) { - } - - @Override - public void finish() { - } -} diff --git a/app/src/main/java/com/fongmi/android/tv/impl/PermissionCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/PermissionCallback.java new file mode 100644 index 000000000..76f1c2a61 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/PermissionCallback.java @@ -0,0 +1,52 @@ +package com.fongmi.android.tv.impl; + +import androidx.annotation.NonNull; + +import com.permissionx.guolindev.callback.RequestCallback; +import com.permissionx.guolindev.request.ChainTask; +import com.permissionx.guolindev.request.ExplainScope; +import com.permissionx.guolindev.request.ForwardScope; + +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +public class PermissionCallback implements RequestCallback, ChainTask { + + private Consumer result; + + public PermissionCallback() { + } + + public PermissionCallback(Consumer result) { + this.result = Objects.requireNonNull(result); + } + + @Override + public void onResult(boolean allGranted, @NonNull List grantedList, @NonNull List deniedList) { + if (result != null) result.accept(allGranted); + } + + @Override + public void finish() { + if (result != null) result.accept(true); + } + + @Override + public ExplainScope getExplainScope() { + return null; + } + + @Override + public ForwardScope getForwardScope() { + return null; + } + + @Override + public void request() { + } + + @Override + public void requestAgain(List permissions) { + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/utils/PermissionUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/PermissionUtil.java new file mode 100644 index 000000000..c266d92f0 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/utils/PermissionUtil.java @@ -0,0 +1,33 @@ +package com.fongmi.android.tv.utils; + +import android.Manifest; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; + +import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.impl.PermissionCallback; +import com.permissionx.guolindev.PermissionX; + +import java.util.function.Consumer; + +public class PermissionUtil { + + public static void requestAudio(FragmentActivity activity, Consumer callback) { + PermissionX.init(activity).permissions(Manifest.permission.RECORD_AUDIO).request(new PermissionCallback(callback)); + } + + public static void requestFile(FragmentActivity activity, Consumer callback) { + if (Setting.hasFileManager()) PermissionX.init(activity).permissions().requestManageExternalStoragePermissionNow(new PermissionCallback(callback)); + else PermissionX.init(activity).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request(new PermissionCallback(callback)); + } + + public static void requestFile(Fragment fragment, Consumer callback) { + if (Setting.hasFileManager()) PermissionX.init(fragment).permissions().requestManageExternalStoragePermissionNow(new PermissionCallback(callback)); + else PermissionX.init(fragment).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request(new PermissionCallback(callback)); + } + + public static void requestNotify(FragmentActivity activity) { + PermissionX.init(activity).permissions(PermissionX.permission.POST_NOTIFICATIONS).request(new PermissionCallback()); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/FileActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/FileActivity.java index 650586e16..23bc45faf 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/FileActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/FileActivity.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.ui.activity; -import android.Manifest; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -14,8 +13,8 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.databinding.ActivityFileBinding; import com.fongmi.android.tv.ui.adapter.FileAdapter; import com.fongmi.android.tv.ui.base.BaseActivity; +import com.fongmi.android.tv.utils.PermissionUtil; import com.github.catvod.utils.Path; -import com.permissionx.guolindev.PermissionX; import java.io.File; @@ -48,15 +47,15 @@ public class FileActivity extends BaseActivity implements FileAdapter.OnClickLis checkPermission(); } - private void checkPermission() { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> update(Path.root())); - } - private void setRecyclerView() { mBinding.recycler.setHasFixedSize(true); mBinding.recycler.setAdapter(mAdapter = new FileAdapter(this)); } + private void checkPermission() { + PermissionUtil.requestFile(this, allGranted -> update(Path.root())); + } + private void update(File dir) { mBinding.recycler.scrollToPosition(0); mAdapter.addAll(Path.list(this.dir = dir)); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index e1beabe7c..f286291c9 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -17,7 +17,6 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.App; import com.fongmi.android.tv.R; -import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.Updater; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; @@ -29,7 +28,6 @@ import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.event.ServerEvent; import com.fongmi.android.tv.event.StateEvent; import com.fongmi.android.tv.impl.Callback; -import com.fongmi.android.tv.impl.ChainTask; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.receiver.ShortcutReceiver; import com.fongmi.android.tv.server.Server; @@ -40,10 +38,10 @@ import com.fongmi.android.tv.ui.fragment.SettingPlayerFragment; import com.fongmi.android.tv.ui.fragment.VodFragment; import com.fongmi.android.tv.utils.FileChooser; import com.fongmi.android.tv.utils.Notify; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; import com.google.android.material.navigation.NavigationBarView; -import com.permissionx.guolindev.PermissionX; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -75,9 +73,9 @@ public class HomeActivity extends BaseActivity implements NavigationBarView.OnIt protected void initView(Bundle savedInstanceState) { orientation = getResources().getConfiguration().orientation; Updater.create().release().start(this); + PermissionUtil.requestNotify(this); initFragment(savedInstanceState); Server.get().start(); - requestPermission(); initConfig(); } @@ -112,12 +110,6 @@ public class HomeActivity extends BaseActivity implements NavigationBarView.OnIt if (savedInstanceState == null) mManager.change(0); } - private void requestPermission() { - PermissionX.init(this).permissions(PermissionX.permission.POST_NOTIFICATIONS).request((allGranted, grantedList, deniedList) -> { - if (Setting.hasFileManager()) PermissionX.init(this).permissions().requestManageExternalStoragePermissionNow(new ChainTask()); - }); - } - private void initConfig() { WallConfig.get().init(); LiveConfig.get().init().load(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index a13816e07..a91369073 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.ui.activity; -import android.Manifest; import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.app.Activity; @@ -87,6 +86,7 @@ import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.FileChooser; import com.fongmi.android.tv.utils.ImgUtil; import com.fongmi.android.tv.utils.Notify; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.PiP; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Sniffer; @@ -96,7 +96,6 @@ import com.fongmi.android.tv.utils.Util; import com.github.bassaer.library.MDColor; import com.github.catvod.utils.Trans; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; -import com.permissionx.guolindev.PermissionX; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -156,7 +155,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo public static void file(FragmentActivity activity, String path) { if (TextUtils.isEmpty(path)) return; String name = new File(path).getName(); - PermissionX.init(activity).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> start(activity, "push_agent", "file://" + path, name)); + PermissionUtil.requestFile(activity, allGranted -> start(activity, "push_agent", "file://" + path, name)); } public static void cast(Activity activity, History history) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java index 0141d8f16..5d03741a4 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.ui.fragment; -import android.Manifest; import android.app.Activity; import android.content.Intent; import android.view.LayoutInflater; @@ -41,12 +40,12 @@ import com.fongmi.android.tv.ui.dialog.SiteDialog; import com.fongmi.android.tv.utils.FileChooser; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Notify; +import com.fongmi.android.tv.utils.PermissionUtil; import com.fongmi.android.tv.utils.ResUtil; import com.github.catvod.bean.Doh; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Path; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.permissionx.guolindev.PermissionX; import java.util.ArrayList; import java.util.List; @@ -136,8 +135,8 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit @Override public void setConfig(Config config) { - if (config.getUrl().startsWith("file") && !PermissionX.isGranted(requireActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> load(config)); + if (config.getUrl().startsWith("file")) { + PermissionUtil.requestFile(this, allGranted -> load(config)); } else { load(config); } @@ -330,7 +329,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit } private void onBackup(View view) { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.backup(new Callback() { + PermissionUtil.requestFile(this, allGranted -> AppDatabase.backup(new Callback() { @Override public void success() { Notify.show(R.string.backup_success); @@ -344,7 +343,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit } private void onRestore(View view) { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> RestoreDialog.create().show(requireActivity(), new Callback() { + PermissionUtil.requestFile(this, allGranted -> RestoreDialog.create().show(requireActivity(), new Callback() { @Override public void success() { Notify.show(R.string.restore_success);