diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java index 78511be21..e8cbfe63c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java @@ -16,6 +16,7 @@ package com.hippo.ehviewer.ui.fragment; +import android.app.Activity; import android.content.Intent; import android.os.Bundle; @@ -75,16 +76,19 @@ public class AdvancedFragment extends BasePreferenceFragment { .show(); IoThreadPoolExecutor.getInstance().execute(() -> { boolean success = EhDB.exportDB(requireActivity(), uri); - requireActivity().runOnUiThread(() -> { - if (alertDialog.isShowing()) { - alertDialog.dismiss(); - } - showTip( - (success) - ? GetText.getString(R.string.settings_advanced_export_data_to, uri.toString()) - : GetText.getString(R.string.settings_advanced_export_data_failed), - BaseScene.LENGTH_SHORT); - }); + Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(() -> { + if (alertDialog.isShowing()) { + alertDialog.dismiss(); + } + showTip( + (success) + ? GetText.getString(R.string.settings_advanced_export_data_to, uri.toString()) + : GetText.getString(R.string.settings_advanced_export_data_failed), + BaseScene.LENGTH_SHORT); + }); + } }); } catch (Exception e) { showTip(R.string.settings_advanced_export_data_failed, BaseScene.LENGTH_SHORT); @@ -189,16 +193,20 @@ public class AdvancedFragment extends BasePreferenceFragment { .show(); IoThreadPoolExecutor.getInstance().execute(() -> { final String error = EhDB.importDB(requireActivity(), uri); - requireActivity().runOnUiThread(() -> { - if (alertDialog.isShowing()) { - alertDialog.dismiss(); - } - if (null == error) { - showTip(getString(R.string.settings_advanced_import_data_successfully), BaseScene.LENGTH_SHORT); - } else { - showTip(error, BaseScene.LENGTH_SHORT); - } - }); + Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(() -> { + if (alertDialog.isShowing()) { + alertDialog.dismiss(); + } + if (null == error) { + showTip(getString(R.string.settings_advanced_import_data_successfully), BaseScene.LENGTH_SHORT); + } else { + showTip(error, BaseScene.LENGTH_SHORT); + } + }); + } + }); } catch (Exception e) { showTip(e.getLocalizedMessage(), BaseScene.LENGTH_SHORT); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index a9331eec4..76d008760 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -50,6 +50,8 @@ import android.widget.ListView; import android.widget.RatingBar; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.DrawableRes; import androidx.annotation.IntDef; import androidx.annotation.NonNull; @@ -57,7 +59,6 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.PopupMenu; -import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; @@ -153,7 +154,6 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene private static final String KEY_GALLERY_DETAIL = "gallery_detail"; private static final String KEY_REQUEST_ID = "request_id"; private static final boolean TRANSITION_ANIMATION_DISABLED = true; - private static final int REQUEST_WRITE_STORAGE = 1; /*--------------- View life cycle ---------------*/ @@ -267,6 +267,20 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene private int mState = STATE_INIT; private boolean mModifingFavorites; + ActivityResultLauncher requestStoragePermissionLauncher = registerForActivityResult( + new ActivityResultContracts.RequestPermission(), + result -> { + if (result && mGalleryDetail != null) { + TorrentListDialogHelper helper = new TorrentListDialogHelper(); + Dialog dialog = new MaterialAlertDialogBuilder(requireActivity()) + .setTitle(R.string.torrents) + .setView(R.layout.dialog_torrent_list) + .setOnDismissListener(helper) + .show(); + helper.setDialog(dialog, mGalleryDetail.torrentUrl); + } + }); + @StringRes private int getRatingText(float rating) { int resId; @@ -1268,7 +1282,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene if (mGalleryDetail != null) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && ContextCompat.checkSelfPermission(requireActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE); + requestStoragePermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE); } else { TorrentListDialogHelper helper = new TorrentListDialogHelper(); Dialog dialog = new MaterialAlertDialogBuilder(context) @@ -1358,20 +1372,6 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene } } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - if (requestCode == REQUEST_WRITE_STORAGE && grantResults[0] == PackageManager.PERMISSION_GRANTED && mGalleryDetail != null) { - TorrentListDialogHelper helper = new TorrentListDialogHelper(); - Dialog dialog = new MaterialAlertDialogBuilder(requireActivity()) - .setTitle(R.string.torrents) - .setView(R.layout.dialog_torrent_list) - .setOnDismissListener(helper) - .show(); - helper.setDialog(dialog, mGalleryDetail.torrentUrl); - } - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - } - private void showFilterUploaderDialog() { Context context = getContext2(); String uploader = getUploader(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index 84a982e60..0d2c2f10f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -101,6 +101,7 @@ import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; import com.hippo.util.AppHelper; import com.hippo.util.DrawableManager; +import com.hippo.util.ExceptionUtils; import com.hippo.view.BringOutTransition; import com.hippo.view.ViewTransition; import com.hippo.widget.ContentLayout; @@ -1426,7 +1427,12 @@ public final class GalleryListScene extends BaseScene @Override public void onSelectImage() { - selectImageLauncher.launch(new String[]{"image/*"}); + try { + selectImageLauncher.launch(new String[]{"image/*"}); + } catch (Throwable e) { + ExceptionUtils.throwIfFatal(e); + showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT); + } } // SearchBarMover.Helper