From 1f65ad122b5ebc58f19681e2ea8ad380f13a2916 Mon Sep 17 00:00:00 2001 From: Alexey Rochev Date: Sun, 2 Jun 2024 03:04:06 +0300 Subject: [PATCH 1/3] Migrate to new activity result API --- .../redreader/activities/BaseActivity.java | 36 ------- .../activities/CommentReplyActivity.java | 34 ++++--- .../activities/ImgurUploadActivity.java | 47 ++++++--- .../activities/OAuthLoginActivity.java | 29 +++++- .../redreader/adapters/AccountListAdapter.kt | 13 +-- .../redreader/common/FileUtils.java | 58 +++++------ .../fragments/AccountListDialog.java | 28 +++--- .../redreader/fragments/UserProfileDialog.kt | 24 ++--- .../postsubmit/PostSubmitContentFragment.java | 35 +++---- .../redreader/settings/SettingsFragment.java | 99 +++++++++---------- 10 files changed, 198 insertions(+), 205 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/activities/BaseActivity.java b/src/main/java/org/quantumbadger/redreader/activities/BaseActivity.java index 7e3be6b66..4eb9f5a53 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/BaseActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/BaseActivity.java @@ -17,7 +17,6 @@ package org.quantumbadger.redreader.activities; -import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.os.Build; @@ -25,7 +24,6 @@ import android.view.WindowManager; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import org.quantumbadger.redreader.R; @@ -50,19 +48,12 @@ public abstract class BaseActivity extends AppCompatActivity private final HashMap mPermissionRequestCallbacks = new HashMap<>(); - private final HashMap mActivityResultCallbacks - = new HashMap<>(); - public interface PermissionCallback { void onPermissionGranted(); void onPermissionDenied(); } - public interface ActivityResultCallback { - void onActivityResult(int resultCode, @Nullable Intent data); - } - public void closeAllExceptMain() { closingAll = true; closeIfNecessary(); @@ -170,33 +161,6 @@ public final void onRequestPermissionsResult( } } - public final void startActivityForResultWithCallback( - @NonNull final Intent intent, - @NonNull final ActivityResultCallback callback) { - - final int requestCode = mRequestIdGenerator.incrementAndGet(); - mActivityResultCallbacks.put(requestCode, callback); - startActivityForResult(intent, requestCode); - } - - @Override - protected final void onActivityResult( - final int requestCode, - final int resultCode, - @Nullable final Intent data) { - - super.onActivityResult(requestCode, resultCode, data); - - final ActivityResultCallback callback - = mActivityResultCallbacks.remove(requestCode); - - if (callback == null) { - return; - } - - callback.onActivityResult(resultCode, data); - } - private void setOrientationFromPrefs() { final PrefsUtility.ScreenOrientation orientation = PrefsUtility.pref_behaviour_screen_orientation(); diff --git a/src/main/java/org/quantumbadger/redreader/activities/CommentReplyActivity.java b/src/main/java/org/quantumbadger/redreader/activities/CommentReplyActivity.java index 9cfeb8274..64a959c6f 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/CommentReplyActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/CommentReplyActivity.java @@ -35,9 +35,11 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.core.content.IntentCompat; import androidx.core.os.BundleCompat; +import androidx.annotation.Nullable; import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.account.RedditAccount; @@ -73,6 +75,8 @@ private enum ParentType { private ParentType mParentType; + private ActivityResultLauncher mImgurUploadActivityLauncher; + private boolean mDraftReset = false; private static String lastText; private static RedditIdAndType lastParentIdAndType; @@ -114,6 +118,9 @@ protected void onCreate(final Bundle savedInstanceState) { final Button uploadPicture = layout.findViewById(R.id.comment_reply_picture); + mImgurUploadActivityLauncher = registerForActivityResult( + new ImgurUploadActivity.ResultContract(), + this::onUploadedPicture); uploadPicture.setOnClickListener(v -> uploadPicture()); if(mParentType == ParentType.COMMENT_OR_POST) { @@ -375,21 +382,18 @@ public void onBackPressed() { } private void uploadPicture() { - final Intent intent = new Intent(this, ImgurUploadActivity.class); - startActivityForResultWithCallback(intent, (resultCode, data) -> { - if (resultCode == 0 && data != null) { - final Uri uploadedImageUrl = data.getData(); - if (uploadedImageUrl != null) { - // set the picture into textedit as a link: [Picture](PictureURL) - final String existingText = textEdit.getText().toString(); - final String picturePretext = getString(R.string.comment_picture_pretext); - final String linkText = - "["+ picturePretext +"](" + uploadedImageUrl + ")"; - final String combinedText = existingText + " " + linkText; - textEdit.setText(combinedText); - } - } - }); + mImgurUploadActivityLauncher.launch(null); } + private void onUploadedPicture(@Nullable final Uri uploadedImageUrl) { + if (uploadedImageUrl != null) { + // set the picture into textedit as a link: [Picture](PictureURL) + final String existingText = textEdit.getText().toString(); + final String picturePretext = getString(R.string.comment_picture_pretext); + final String linkText = + "["+ picturePretext +"](" + uploadedImageUrl + ")"; + final String combinedText = existingText + " " + linkText; + textEdit.setText(combinedText); + } + } } diff --git a/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java b/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java index 5fb7224fe..84caab7ac 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/ImgurUploadActivity.java @@ -17,6 +17,7 @@ package org.quantumbadger.redreader.activities; +import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -32,7 +33,11 @@ import android.widget.ScrollView; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContract; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.account.RedditAccountManager; @@ -74,6 +79,8 @@ public class ImgurUploadActivity extends ViewsBaseActivity { private View mLoadingOverlay; + private ActivityResultLauncher mSelectImageActivityLauncher; + @Override protected void onCreate(final Bundle savedInstanceState) { @@ -108,21 +115,15 @@ protected void onCreate(final Bundle savedInstanceState) { layout.addView(mThumbnailView); General.setAllMarginsDp(this, mThumbnailView, 20); + mSelectImageActivityLauncher = registerForActivityResult( + new ActivityResultContracts.GetContent(), + uri -> { + if (uri != null) { + onImageSelected(uri); + } + }); browseButton.setOnClickListener(v -> { - final Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("image/*"); - startActivityForResultWithCallback(intent, (resultCode, data) -> { - - if(data == null || data.getData() == null) { - return; - } - - if(resultCode != RESULT_OK) { - return; - } - - onImageSelected(data.getData()); - }); + mSelectImageActivityLauncher.launch("image/*"); }); mUploadButton.setOnClickListener(v -> { @@ -336,7 +337,7 @@ public void onJsonParsed( final Intent resultIntent = new Intent(); resultIntent.setData(imageUri); - setResult(0, resultIntent); + setResult(RESULT_OK, resultIntent); finish(); }); } @@ -359,4 +360,20 @@ public void onBackPressed() { super.onBackPressed(); } } + + public static class ResultContract extends ActivityResultContract { + @NonNull + @Override + public Intent createIntent(@NonNull final Context context, final Void unused) { + return new Intent(context, ImgurUploadActivity.class); + } + + @Override + public Uri parseResult(final int resultCode, @Nullable final Intent intent) { + if (resultCode == RESULT_OK && intent != null) { + return intent.getData(); + } + return null; + } + } } diff --git a/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java b/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java index 23a287048..31451c609 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java @@ -18,6 +18,7 @@ package org.quantumbadger.redreader.activities; import android.annotation.SuppressLint; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; @@ -30,6 +31,12 @@ import android.webkit.WebView; import android.webkit.WebViewClient; +import androidx.activity.result.contract.ActivityResultContract; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import info.guardianproject.netcipher.webkit.WebkitProxy; + import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.RedReader; import org.quantumbadger.redreader.common.PrefsUtility; @@ -38,8 +45,6 @@ import java.util.Objects; -import info.guardianproject.netcipher.webkit.WebkitProxy; - public class OAuthLoginActivity extends ViewsBaseActivity { private static final String OAUTH_HOST = "rr_oauth_redir"; @@ -116,8 +121,8 @@ public boolean shouldOverrideUrlLoading( (Objects.equals(url.getScheme(), REDREADER_SCHEME) || Objects.equals(url.getScheme(), HTTP_SCHEME))) { final Intent intent = new Intent(); - intent.putExtra("url", url.toString()); - setResult(123, intent); + intent.setData(Uri.parse(url)); + setResult(RESULT_OK, intent); finish(); } else { @@ -154,4 +159,20 @@ protected void onResume() { mWebView.onResume(); } } + + public static class ResultContract extends ActivityResultContract { + @NonNull + @Override + public Intent createIntent(@NonNull final Context context, final Void unused) { + return new Intent(context, OAuthLoginActivity.class); + } + + @Override + public Uri parseResult(final int resultCode, @Nullable final Intent intent) { + if (resultCode == RESULT_OK && intent != null) { + return intent.getData(); + } + return null; + } + } } diff --git a/src/main/java/org/quantumbadger/redreader/adapters/AccountListAdapter.kt b/src/main/java/org/quantumbadger/redreader/adapters/AccountListAdapter.kt index 8103f33ad..e6110b2a2 100644 --- a/src/main/java/org/quantumbadger/redreader/adapters/AccountListAdapter.kt +++ b/src/main/java/org/quantumbadger/redreader/adapters/AccountListAdapter.kt @@ -17,22 +17,20 @@ package org.quantumbadger.redreader.adapters import android.content.DialogInterface -import android.content.Intent import android.graphics.Color import android.graphics.Paint import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources -import androidx.fragment.app.Fragment import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textview.MaterialTextView import org.quantumbadger.redreader.R import org.quantumbadger.redreader.account.RedditAccountManager -import org.quantumbadger.redreader.activities.OAuthLoginActivity import org.quantumbadger.redreader.common.BetterSSB import org.quantumbadger.redreader.common.LinkHandler import org.quantumbadger.redreader.common.UriString @@ -40,7 +38,7 @@ import org.quantumbadger.redreader.reddit.api.RedditOAuth.needsRelogin import org.quantumbadger.redreader.viewholders.VH1Text -class AccountListAdapter(private val context: AppCompatActivity, private val fragment: Fragment) : +class AccountListAdapter(private val context: AppCompatActivity, private val loginActivityLauncher: ActivityResultLauncher) : HeaderRecyclerAdapter() { private val accounts = RedditAccountManager.getInstance(context).accounts private val rrIconAdd: Drawable? @@ -82,7 +80,7 @@ class AccountListAdapter(private val context: AppCompatActivity, private val fra .setCancelable(true) .setPositiveButton( R.string.dialog_continue - ) { _: DialogInterface?, _: Int -> launchLogin() } + ) { _: DialogInterface?, _: Int -> loginActivityLauncher.launch(null) } .setNegativeButton( R.string.dialog_close ) { _: DialogInterface?, _: Int -> } @@ -96,11 +94,6 @@ class AccountListAdapter(private val context: AppCompatActivity, private val fra } } - private fun launchLogin() { - val loginIntent = Intent(context, OAuthLoginActivity::class.java) - fragment.startActivityForResult(loginIntent, 123) - } - override fun onBindContentItemViewHolder( holder: RecyclerView.ViewHolder?, position: Int diff --git a/src/main/java/org/quantumbadger/redreader/common/FileUtils.java b/src/main/java/org/quantumbadger/redreader/common/FileUtils.java index 7e3b69878..c37bf017c 100644 --- a/src/main/java/org/quantumbadger/redreader/common/FileUtils.java +++ b/src/main/java/org/quantumbadger/redreader/common/FileUtils.java @@ -31,6 +31,8 @@ import android.util.Log; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -59,6 +61,7 @@ import java.io.OutputStream; import java.nio.file.Files; import java.util.HashMap; +import java.util.Objects; import java.util.UUID; public class FileUtils { @@ -330,46 +333,43 @@ private static void mediaStoreDownloadsInsertFile( }).start(); } + @SuppressWarnings("PMD.UseShortArrayInitializer") private static void createSAFDocumentWithIntent( @NonNull final BaseActivity activity, @NonNull final String filename, @Nullable final String mimetype, @NonNull final FileDataSource source, @NonNull final Runnable onSuccess) { + //noinspection unchecked + final ActivityResultLauncher[] launcher = new ActivityResultLauncher[]{null}; + launcher[0] = activity.registerForActivityResult( + new ActivityResultContracts.CreateDocument(mimetype != null ? mimetype : "*/*"), + uri -> { + launcher[0].unregister(); + + if(uri == null) { + return; + } - final Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT) - .setType(mimetype) - .putExtra(Intent.EXTRA_TITLE, filename) - .addCategory(Intent.CATEGORY_OPENABLE); - - try { - activity.startActivityForResultWithCallback( - intent, - (resultCode, data) -> { - - if (data == null || data.getData() == null) { - return; - } - - new Thread(() -> { - - try (OutputStream outputStream = activity.getContentResolver() - .openOutputStream(data.getData())) { - - source.writeTo(outputStream); + new Thread(() -> { + try (OutputStream outputStream = activity.getContentResolver() + .openOutputStream(uri)) { - onSuccess.run(); + source.writeTo(Objects.requireNonNull(outputStream)); - } catch (final IOException e) { - showUnexpectedStorageErrorDialog( - activity, - e, - new UriString(data.getData().toString())); - } + onSuccess.run(); - }).start(); - }); + } catch (final IOException e) { + showUnexpectedStorageErrorDialog( + activity, + e, + UriString.from(uri)); + } + }).start(); + }); + try { + launcher[0].launch(filename); } catch (final ActivityNotFoundException e) { DialogUtils.showDialog( activity, diff --git a/src/main/java/org/quantumbadger/redreader/fragments/AccountListDialog.java b/src/main/java/org/quantumbadger/redreader/fragments/AccountListDialog.java index 6faba54f3..aaf45ecb1 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/AccountListDialog.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/AccountListDialog.java @@ -18,11 +18,11 @@ package org.quantumbadger.redreader.fragments; import android.app.Dialog; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDialogFragment; import androidx.recyclerview.widget.LinearLayoutManager; @@ -34,6 +34,7 @@ import org.quantumbadger.redreader.account.RedditAccountChangeListener; import org.quantumbadger.redreader.account.RedditAccountManager; import org.quantumbadger.redreader.activities.BaseActivity; +import org.quantumbadger.redreader.activities.OAuthLoginActivity; import org.quantumbadger.redreader.adapters.AccountListAdapter; import org.quantumbadger.redreader.common.AndroidCommon; import org.quantumbadger.redreader.common.General; @@ -50,6 +51,8 @@ public class AccountListDialog extends AppCompatDialogFragment private RecyclerView rv; + private ActivityResultLauncher mOAuthLoginActivityLauncher; + public static void show(final AppCompatActivity activity) { new AccountListDialog().show( activity.getSupportFragmentManager(), @@ -59,14 +62,15 @@ public static void show(final AppCompatActivity activity) { private AccountListDialog() {} @Override - public void onActivityResult( - final int requestCode, - final int resultCode, - final Intent data) { - if(requestCode == 123 && requestCode == resultCode && data.hasExtra("url")) { - final Uri uri = Uri.parse(data.getStringExtra("url")); - RedditOAuth.completeLogin(mActivity, uri, RunnableOnce.DO_NOTHING); - } + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mOAuthLoginActivityLauncher = registerForActivityResult( + new OAuthLoginActivity.ResultContract(), + uri -> { + if (uri != null) { + RedditOAuth.completeLogin(mActivity, uri, RunnableOnce.DO_NOTHING); + } + }); } @NonNull @@ -87,7 +91,7 @@ public Dialog onCreateDialog(final Bundle savedInstanceState) { rv = new RecyclerView(mActivity); rv.setLayoutManager(new LinearLayoutManager(mActivity)); - rv.setAdapter(new AccountListAdapter(mActivity, this)); + rv.setAdapter(new AccountListAdapter(mActivity, mOAuthLoginActivityLauncher)); rv.setHasFixedSize(true); final int paddingPx = General.dpToPixels(mActivity, 16f); @@ -104,7 +108,7 @@ public Dialog onCreateDialog(final Bundle savedInstanceState) { @Override public void onRedditAccountChanged() { AndroidCommon.UI_THREAD_HANDLER.post(() -> { - rv.setAdapter(new AccountListAdapter(mActivity, this)); + rv.setAdapter(new AccountListAdapter(mActivity, mOAuthLoginActivityLauncher)); if(mActivity instanceof BaseActivity) { AndroidCommon.promptForNotificationPermission((BaseActivity) mActivity, null); diff --git a/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt b/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt index d27a74fb8..aaee7e82a 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt +++ b/src/main/java/org/quantumbadger/redreader/fragments/UserProfileDialog.kt @@ -19,12 +19,12 @@ package org.quantumbadger.redreader.fragments import android.content.Intent import android.graphics.BitmapFactory -import android.net.Uri import android.util.Log import android.view.View import android.widget.FrameLayout import android.widget.ImageView import android.widget.ScrollView +import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.AppCompatImageView import com.google.android.material.card.MaterialCardView @@ -33,7 +33,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textview.MaterialTextView import org.quantumbadger.redreader.R import org.quantumbadger.redreader.account.RedditAccountManager -import org.quantumbadger.redreader.activities.BaseActivity import org.quantumbadger.redreader.activities.BugReportActivity import org.quantumbadger.redreader.activities.OAuthLoginActivity import org.quantumbadger.redreader.activities.PMSendActivity @@ -60,6 +59,7 @@ import org.quantumbadger.redreader.reddit.url.UserPostListingURL import org.quantumbadger.redreader.views.LoadingSpinnerView import org.quantumbadger.redreader.views.liststatus.ErrorView import java.io.IOException +import java.lang.Void import java.net.URISyntaxException import java.text.NumberFormat import java.util.* @@ -387,7 +387,7 @@ object UserProfileDialog { .setMessage(activity.getString(R.string.block_permission_denied_message)) .setPositiveButton(activity.getString(R.string.block_permission_denied_relogin)) { dialog, which -> //perform a re-logion - launchAndCompleteLogin(activity, context) + launchAndCompleteLogin(activity) } .setNegativeButton(activity.getString(R.string.dialog_cancel), null) .show() @@ -408,19 +408,15 @@ object UserProfileDialog { ) } - private fun launchAndCompleteLogin(activity: AppCompatActivity, context: AppCompatActivity) { - val loginIntent = Intent(context, OAuthLoginActivity::class.java) - //let OAuthLoginActivity call back the url and code 123, then do completeLogin - (activity as BaseActivity).startActivityForResultWithCallback( - loginIntent - ) { resultCode: Int, data: Intent? -> - if (data != null) { - if (resultCode == 123 && data.hasExtra("url")) { - val uri = Uri.parse(data.getStringExtra("url")) - completeLogin(activity, uri, RunnableOnce.DO_NOTHING) - } + private fun launchAndCompleteLogin(activity: AppCompatActivity) { + lateinit var launcher: ActivityResultLauncher + launcher = activity.registerForActivityResult(OAuthLoginActivity.ResultContract()) { uri -> + launcher.unregister() + if (uri != null) { + completeLogin(activity, uri, RunnableOnce.DO_NOTHING) } } + launcher.launch(null) } @Throws(URISyntaxException::class) diff --git a/src/main/java/org/quantumbadger/redreader/fragments/postsubmit/PostSubmitContentFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/postsubmit/PostSubmitContentFragment.java index ec34f6596..51f8dfe4d 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/postsubmit/PostSubmitContentFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/postsubmit/PostSubmitContentFragment.java @@ -19,7 +19,6 @@ import android.app.ProgressDialog; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.text.InputType; import android.util.Log; @@ -34,6 +33,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; @@ -49,7 +49,6 @@ import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.account.RedditAccount; import org.quantumbadger.redreader.account.RedditAccountManager; -import org.quantumbadger.redreader.activities.BaseActivity; import org.quantumbadger.redreader.activities.BugReportActivity; import org.quantumbadger.redreader.activities.ImgurUploadActivity; import org.quantumbadger.redreader.cache.CacheManager; @@ -161,6 +160,20 @@ public interface Listener { private final HashMap mFlairIds = new HashMap<>(); + private ActivityResultLauncher mImgurUploadActivityLauncher; + + @Override + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mImgurUploadActivityLauncher = registerForActivityResult( + new ImgurUploadActivity.ResultContract(), + uri -> { + if (uri != null) { + mTextEdit.setText(uri.toString()); + } + }); + } + @Override public void onResume() { super.onResume(); @@ -332,24 +345,8 @@ private void setHint() { } if(selected.equals(POST_TYPE_IMGUR)) { - mTypeSpinner.setSelection(0); // Link - - final FragmentActivity activity = getActivity(); - - if(activity == null) { - return; - } - - final Intent intent = new Intent(activity, ImgurUploadActivity.class); - - ((BaseActivity)activity).startActivityForResultWithCallback( - intent, - (resultCode, data) -> { - if(data != null && data.getData() != null) { - mTextEdit.setText(data.getData().toString()); - } - }); + mImgurUploadActivityLauncher.launch(null); } } diff --git a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java index 2d2cd3f58..d16360de5 100644 --- a/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java +++ b/src/main/java/org/quantumbadger/redreader/settings/SettingsFragment.java @@ -22,12 +22,16 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.text.Html; import android.util.Log; import android.widget.ProgressBar; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; @@ -74,6 +78,48 @@ public final class SettingsFragment extends PreferenceFragmentCompat { @StringRes private int mTitle; + private ActivityResultLauncher mCreateDocumentActivityLauncher; + private ActivityResultLauncher mOpenDocumentActivityLauncher; + + @Override + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mCreateDocumentActivityLauncher = registerForActivityResult( + new ActivityResultContracts.CreateDocument("application/vnd.redreader.prefsbackup"), + this::onCreatedBackupFile); + mOpenDocumentActivityLauncher = registerForActivityResult( + new ActivityResultContracts.OpenDocument(), + this::onOpenedBackupFile); + } + + private void onCreatedBackupFile(@Nullable final Uri uri) { + if(uri == null) { + return; + } + final Activity activity = requireActivity(); + final ContentResolver contentResolver = activity.getContentResolver(); + PrefsBackup.backup( + (BaseActivity) activity, + () -> Objects.requireNonNull(contentResolver.openOutputStream(uri)), + () -> General.quickToast( + requireContext(), + R.string.backup_preferences_success)); + } + + private void onOpenedBackupFile(@Nullable final Uri uri) { + if(uri == null) { + return; + } + final Activity activity = requireActivity(); + final ContentResolver contentResolver = activity.getContentResolver(); + PrefsBackup.restore( + (BaseActivity) activity, + () -> Objects.requireNonNull(contentResolver.openInputStream(uri)), + () -> General.quickToast( + requireContext(), + R.string.restore_preferences_success)); + } + @Override public void onResume() { super.onResume(); @@ -340,34 +386,9 @@ public void onCreatePreferences( = utc.formatFilenameSafe() + ".rr_prefs_backup"; - //noinspection SpellCheckingInspection - final Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT) - .setType("application/vnd.redreader.prefsbackup") - .putExtra(Intent.EXTRA_TITLE, filename) - .addCategory(Intent.CATEGORY_OPENABLE); - try { - activity.startActivityForResultWithCallback( - intent, - (resultCode, data) -> { - - if(data == null || data.getData() == null) { - return; - } - - final ContentResolver contentResolver - = activity.getContentResolver(); - - PrefsBackup.backup( - activity, - () -> contentResolver.openOutputStream(data.getData()), - () -> General.quickToast( - context, - R.string.backup_preferences_success)); - }); - + mCreateDocumentActivityLauncher.launch(filename); } catch(final ActivityNotFoundException e) { - DialogUtils.showDialog( activity, R.string.error_no_file_manager_title, @@ -387,33 +408,9 @@ public void onCreatePreferences( return true; } - final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT) - .setType("*/*") - .addCategory(Intent.CATEGORY_OPENABLE); - try { - activity.startActivityForResultWithCallback( - intent, - (resultCode, data) -> { - - if(data == null || data.getData() == null) { - return; - } - - final ContentResolver contentResolver - = activity.getContentResolver(); - - PrefsBackup.restore( - activity, - () -> contentResolver.openInputStream(data.getData()), - () -> General.quickToast( - context, - R.string.restore_preferences_success)); - - }); - + mOpenDocumentActivityLauncher.launch(new String[]{}); } catch(final ActivityNotFoundException e) { - DialogUtils.showDialog( activity, R.string.error_no_file_manager_title, From f42c60a28b2c7599d0e928eb4e9b1701b6593ece Mon Sep 17 00:00:00 2001 From: Alexey Rochev Date: Sun, 2 Jun 2024 03:07:16 +0300 Subject: [PATCH 2/3] Remove unnecessary startActivityForResult calls --- .../quantumbadger/redreader/activities/MainActivity.java | 2 +- .../redreader/activities/OptionsMenuUtility.java | 4 +--- .../redreader/activities/PostListingActivity.java | 2 +- .../java/org/quantumbadger/redreader/common/LinkHandler.kt | 6 +++--- .../org/quantumbadger/redreader/fragments/RRFragment.java | 6 ------ .../quantumbadger/redreader/reddit/SubredditDetails.java | 2 +- .../quantumbadger/redreader/reddit/api/RedditPostActions.kt | 2 +- .../redreader/reddit/things/RedditSubreddit.java | 2 +- 8 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java b/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java index 29d0107fc..0e40e48c5 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/MainActivity.java @@ -566,7 +566,7 @@ public void onSelected(final PostListingURL url) { } else { final Intent intent = new Intent(this, PostListingActivity.class); intent.setData(url.generateJsonUri()); - startActivityForResult(intent, 1); + startActivity(intent); } } diff --git a/src/main/java/org/quantumbadger/redreader/activities/OptionsMenuUtility.java b/src/main/java/org/quantumbadger/redreader/activities/OptionsMenuUtility.java index 34bf62b53..e10617709 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/OptionsMenuUtility.java +++ b/src/main/java/org/quantumbadger/redreader/activities/OptionsMenuUtility.java @@ -629,9 +629,7 @@ private static void add( final Intent intent = new Intent( activity, SettingsActivity.class); - activity.startActivityForResult( - intent, - 1); + activity.startActivity(intent); return true; }); diff --git a/src/main/java/org/quantumbadger/redreader/activities/PostListingActivity.java b/src/main/java/org/quantumbadger/redreader/activities/PostListingActivity.java index fbb90d106..ea0ac3c26 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/PostListingActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/PostListingActivity.java @@ -399,7 +399,7 @@ public void onSidebar() { intent.putExtra("title", String.format(Locale.US, "%s: %s", getString(R.string.sidebar_activity_title), fragment.getSubreddit().url)); - startActivityForResult(intent, 1); + startActivity(intent); } } diff --git a/src/main/java/org/quantumbadger/redreader/common/LinkHandler.kt b/src/main/java/org/quantumbadger/redreader/common/LinkHandler.kt index ea6522a53..b3e01bba7 100644 --- a/src/main/java/org/quantumbadger/redreader/common/LinkHandler.kt +++ b/src/main/java/org/quantumbadger/redreader/common/LinkHandler.kt @@ -196,7 +196,7 @@ object LinkHandler { RedditURLParser.SUBREDDIT_POST_LISTING_URL, RedditURLParser.MULTIREDDIT_POST_LISTING_URL, RedditURLParser.USER_POST_LISTING_URL, RedditURLParser.SEARCH_POST_LISTING_URL, RedditURLParser.UNKNOWN_POST_LISTING_URL -> { val intent = Intent(activity, PostListingActivity::class.java) intent.setData(redditURL.generateJsonUri()) - activity.startActivityForResult(intent, 1) + activity.startActivity(intent) return } @@ -206,7 +206,7 @@ object LinkHandler { CommentListingActivity::class.java ) intent.setData(redditURL.generateJsonUri()) - activity.startActivityForResult(intent, 1) + activity.startActivity(intent) return } @@ -227,7 +227,7 @@ object LinkHandler { intent.putExtra(PMSendActivity.EXTRA_TEXT, cmUrl.message) } - activity.startActivityForResult(intent, 1) + activity.startActivity(intent) return } diff --git a/src/main/java/org/quantumbadger/redreader/fragments/RRFragment.java b/src/main/java/org/quantumbadger/redreader/fragments/RRFragment.java index 212770503..14238cdfc 100644 --- a/src/main/java/org/quantumbadger/redreader/fragments/RRFragment.java +++ b/src/main/java/org/quantumbadger/redreader/fragments/RRFragment.java @@ -60,12 +60,6 @@ protected final void startActivity(final Intent intent) { mParent.startActivity(intent); } - protected final void startActivityForResult( - final Intent intent, - final int requestCode) { - mParent.startActivityForResult(intent, requestCode); - } - public void onCreateOptionsMenu(final Menu menu) { } diff --git a/src/main/java/org/quantumbadger/redreader/reddit/SubredditDetails.java b/src/main/java/org/quantumbadger/redreader/reddit/SubredditDetails.java index a17ed6526..b97470c89 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/SubredditDetails.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/SubredditDetails.java @@ -93,6 +93,6 @@ public void showSidebarActivity(final AppCompatActivity context) { context.getString(R.string.sidebar_activity_title), url)); - context.startActivityForResult(intent, 1); + context.startActivity(intent); } } diff --git a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditPostActions.kt b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditPostActions.kt index 6202145b0..72bce87c9 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/api/RedditPostActions.kt +++ b/src/main/java/org/quantumbadger/redreader/reddit/api/RedditPostActions.kt @@ -509,7 +509,7 @@ object RedditPostActions { val intent = Intent(activity, PostListingActivity::class.java) intent.data = SubredditPostListURL.getSubreddit(post.src.subreddit) .generateJsonUri() - activity.startActivityForResult(intent, 1) + activity.startActivity(intent) } catch (e: InvalidSubredditNameException) { Toast.makeText( activity, diff --git a/src/main/java/org/quantumbadger/redreader/reddit/things/RedditSubreddit.java b/src/main/java/org/quantumbadger/redreader/reddit/things/RedditSubreddit.java index 099bea882..b2005a808 100644 --- a/src/main/java/org/quantumbadger/redreader/reddit/things/RedditSubreddit.java +++ b/src/main/java/org/quantumbadger/redreader/reddit/things/RedditSubreddit.java @@ -252,7 +252,7 @@ public void showSidebarActivity(final AppCompatActivity context) { context.getString(R.string.sidebar_activity_title), url)); - context.startActivityForResult(intent, 1); + context.startActivity(intent); } @NonNull From 4fa78aeb1a8a2e9e6abf3bfd312a7f8b98f1032d Mon Sep 17 00:00:00 2001 From: QuantumBadger Date: Sun, 20 Apr 2025 19:15:19 +0100 Subject: [PATCH 3/3] Fix build issue (#1204) --- .../redreader/activities/OAuthLoginActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java b/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java index 31451c609..b19cfadd3 100644 --- a/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java +++ b/src/main/java/org/quantumbadger/redreader/activities/OAuthLoginActivity.java @@ -35,8 +35,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import info.guardianproject.netcipher.webkit.WebkitProxy; - import org.quantumbadger.redreader.R; import org.quantumbadger.redreader.RedReader; import org.quantumbadger.redreader.common.PrefsUtility; @@ -45,6 +43,8 @@ import java.util.Objects; +import info.guardianproject.netcipher.webkit.WebkitProxy; + public class OAuthLoginActivity extends ViewsBaseActivity { private static final String OAUTH_HOST = "rr_oauth_redir"; @@ -121,7 +121,7 @@ public boolean shouldOverrideUrlLoading( (Objects.equals(url.getScheme(), REDREADER_SCHEME) || Objects.equals(url.getScheme(), HTTP_SCHEME))) { final Intent intent = new Intent(); - intent.setData(Uri.parse(url)); + intent.setData(url); setResult(RESULT_OK, intent); finish();