diff --git a/WordPress/src/main/java/org/wordpress/android/ui/AddQuickPressShortcutActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/AddQuickPressShortcutActivity.java index da9489a8c9af..b6e3cd7ad806 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/AddQuickPressShortcutActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/AddQuickPressShortcutActivity.java @@ -71,7 +71,7 @@ public void onCreate(Bundle savedInstanceState) { @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/CollapseFullScreenDialogFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/CollapseFullScreenDialogFragment.java index 808cacf81de9..7e694dfa9634 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/CollapseFullScreenDialogFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/CollapseFullScreenDialogFragment.java @@ -14,6 +14,8 @@ import android.view.ViewGroup; import android.view.Window; +import androidx.activity.ComponentDialog; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; @@ -146,12 +148,14 @@ public void setConfirmEnabled(boolean enabled) { public Dialog onCreateDialog(Bundle savedInstanceState) { initBuilderArguments(); - Dialog dialog = new Dialog(requireContext(), getTheme()) { + ComponentDialog dialog = (ComponentDialog) super.onCreateDialog(savedInstanceState); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { @Override - public void onBackPressed() { + public void handleOnBackPressed() { onCollapseClicked(); } }; + dialog.getOnBackPressedDispatcher().addCallback(this, callback); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; @@ -297,7 +301,7 @@ private void initToolbar(View view) { } } - public void onBackPressed() { + public void collapse() { if (isAdded()) { onCollapseClicked(); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/FullScreenDialogFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/FullScreenDialogFragment.java index b07b8084ac39..42f7004390a8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/FullScreenDialogFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/FullScreenDialogFragment.java @@ -14,6 +14,8 @@ import android.view.ViewGroup; import android.view.Window; +import androidx.activity.ComponentDialog; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.ColorRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -166,12 +168,14 @@ public void dismiss() { public Dialog onCreateDialog(Bundle savedInstanceState) { initBuilderArguments(); - Dialog dialog = new Dialog(getActivity(), getTheme()) { + ComponentDialog dialog = (ComponentDialog) super.onCreateDialog(savedInstanceState); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { @Override - public void onBackPressed() { + public void handleOnBackPressed() { onDismissClicked(); } }; + dialog.getOnBackPressedDispatcher().addCallback(this, callback); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); return dialog; @@ -329,12 +333,6 @@ private void initToolbar(View view) { } } - public void onBackPressed() { - if (isAdded()) { - onDismissClicked(); - } - } - protected void onConfirmClicked() { boolean isConsumed = ((FullScreenDialogContent) mFragment).onConfirmClicked(mController); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/JetpackConnectionResultActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/JetpackConnectionResultActivity.java index 69159dc25f3f..93dc0b76cc6f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/JetpackConnectionResultActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/JetpackConnectionResultActivity.java @@ -5,6 +5,7 @@ import android.os.Bundle; import android.text.TextUtils; +import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -22,6 +23,7 @@ import org.wordpress.android.util.SiteUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import javax.inject.Inject; @@ -54,6 +56,15 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.stats_loading_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + finishAndGoBackToSource(); + } + }; + + getOnBackPressedDispatcher().addCallback(this, callback); Toolbar toolbar = findViewById(R.id.toolbar_main); setSupportActionBar(toolbar); @@ -109,12 +120,6 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } } - @Override - public void onBackPressed() { - super.onBackPressed(); - finishAndGoBackToSource(); - } - private void trackResult() { if (!TextUtils.isEmpty(mReason)) { if (mReason.equals(ALREADY_CONNECTED)) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/WPTooltipView.kt b/WordPress/src/main/java/org/wordpress/android/ui/WPTooltipView.kt index dcaf4e163818..093b7315d7cd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/WPTooltipView.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/WPTooltipView.kt @@ -137,7 +137,7 @@ class WPTooltipView @JvmOverloads constructor( .alpha(0f) .setDuration(HIDE_ANIMATION_DURATION) .setListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) visibility = View.GONE } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java index 1dc437490e16..f12310eba6ea 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java @@ -22,6 +22,7 @@ import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -60,6 +61,7 @@ import org.wordpress.android.util.UrlUtils; import org.wordpress.android.util.WPUrlUtils; import org.wordpress.android.util.WPWebViewClient; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.viewmodel.wpwebview.WPWebViewViewModel; import org.wordpress.android.viewmodel.wpwebview.WPWebViewViewModel.NavBarUiState; import org.wordpress.android.viewmodel.wpwebview.WPWebViewViewModel.PreviewModeSelectorStatus; @@ -161,6 +163,21 @@ public class WPWebViewActivity extends WebViewActivity implements ErrorManagedWe public void onCreate(Bundle savedInstanceState) { ((WordPress) getApplication()).component().inject(this); super.onCreate(savedInstanceState); + + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (mWebView.canGoBack()) { + mWebView.goBack(); + refreshBackForwardNavButtons(); + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + mViewModel.track(Stat.WEBVIEW_DISMISSED); + setResultIfNeeded(); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); } @Override @@ -916,18 +933,6 @@ private void setResultIfNeededAndFinish() { finish(); } - @Override - public void onBackPressed() { - if (mWebView.canGoBack()) { - mWebView.goBack(); - refreshBackForwardNavButtons(); - } else { - super.onBackPressed(); - mViewModel.track(Stat.WEBVIEW_DISMISSED); - setResultIfNeeded(); - } - } - @Override public void onStart() { super.onStart(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/WebViewActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/WebViewActivity.java index 43ccf8c2f184..cb67fdb3f6f0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/WebViewActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/WebViewActivity.java @@ -6,11 +6,13 @@ import android.view.Window; import android.webkit.WebView; +import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; import org.wordpress.android.R; import org.wordpress.android.WordPress; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import java.util.Map; @@ -39,6 +41,19 @@ public void onCreate(Bundle savedInstanceState) { configureView(); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (mWebView != null && mWebView.canGoBack()) { + mWebView.goBack(); + } else { + cancel(); + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + mWebView = (WebView) findViewById(R.id.webView); mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); // Setting this user agent makes Calypso sites hide any WordPress UIs (e.g. Masterbar, banners, etc.). @@ -145,16 +160,6 @@ public void loadUrl(String url, Map additionalHttpHeaders) { mWebView.loadUrl(url, additionalHttpHeaders); } - @Override - public void onBackPressed() { - if (mWebView != null && mWebView.canGoBack()) { - mWebView.goBack(); - } else { - cancel(); - super.onBackPressed(); - } - } - @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/HelpActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/HelpActivity.kt index 5e31c8ee9575..1550cb5839eb 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/HelpActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/HelpActivity.kt @@ -148,7 +148,7 @@ class HelpActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java index 2446676c933b..5167eafb8415 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/LoginActivity.java @@ -295,7 +295,7 @@ private LoginEmailFragment getLoginEmailFragment() { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/PostSignupInterstitialActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/PostSignupInterstitialActivity.kt index 63f831845130..7086e85b4116 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/PostSignupInterstitialActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/PostSignupInterstitialActivity.kt @@ -1,6 +1,7 @@ package org.wordpress.android.ui.accounts import android.os.Bundle +import androidx.activity.addCallback import androidx.lifecycle.ViewModelProvider import com.google.android.material.button.MaterialButton import org.wordpress.android.R @@ -31,6 +32,9 @@ class PostSignupInterstitialActivity : LocaleAwareActivity() { .get(PostSignupInterstitialViewModel::class.java) val binding = PostSignupInterstitialActivityBinding.inflate(layoutInflater) setContentView(binding.root) + + onBackPressedDispatcher.addCallback(this) { viewModel.onBackButtonPressed() } + with(binding) { viewModel.onInterstitialShown() createNewSiteButton().setOnClickListener { viewModel.onCreateNewSiteButtonPressed() } @@ -38,7 +42,7 @@ class PostSignupInterstitialActivity : LocaleAwareActivity() { dismissButton().setOnClickListener { viewModel.onDismissButtonPressed() } } - viewModel.navigationAction.observe(this, { executeAction(it) }) + viewModel.navigationAction.observe(this) { executeAction(it) } } private fun PostSignupInterstitialActivityBinding.createNewSiteButton() = @@ -50,10 +54,6 @@ class PostSignupInterstitialActivity : LocaleAwareActivity() { private fun PostSignupInterstitialActivityBinding.dismissButton() = root.findViewById(R.id.dismiss_button) - override fun onBackPressed() { - viewModel.onBackButtonPressed() - } - private fun executeAction(navigationAction: NavigationAction) = when (navigationAction) { START_SITE_CREATION_FLOW -> startSiteCreationFlow() START_SITE_CONNECTION_FLOW -> startSiteConnectionFlow() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesFragment.kt index cc9b6983e869..2c024a02a88f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesFragment.kt @@ -3,7 +3,7 @@ package org.wordpress.android.ui.accounts.login.jetpack import android.content.Context import android.os.Bundle import android.view.View -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint @@ -42,7 +42,7 @@ class LoginNoSitesFragment : Fragment(R.layout.jetpack_login_empty_view) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initBackPressHandler() + requireActivity().onBackPressedDispatcher.addCallback(this) { viewModel.onBackPressed() } with(JetpackLoginEmptyViewBinding.bind(view)) { initContentViews() initClickListeners() @@ -141,16 +141,4 @@ class LoginNoSitesFragment : Fragment(R.layout.jetpack_login_empty_view) { super.onResume() viewModel.onFragmentResume() } - - private fun initBackPressHandler() { - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback( - true - ) { - override fun handleOnBackPressed() { - viewModel.onBackPressed() - } - }) - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModel.kt index b879e5c0bc9f..a3f2ae9dc7b9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModel.kt @@ -17,6 +17,7 @@ import org.wordpress.android.ui.accounts.UnifiedLoginTracker import org.wordpress.android.ui.accounts.UnifiedLoginTracker.Step import org.wordpress.android.ui.accounts.login.jetpack.LoginNoSitesViewModel.State.NoUser import org.wordpress.android.ui.accounts.login.jetpack.LoginNoSitesViewModel.State.ShowUser +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ScopedViewModel import java.io.Serializable @@ -58,8 +59,9 @@ class LoginNoSitesViewModel @Inject constructor( _uiModel.postValue(UiModel(state = state)) } - private fun buildStateFromSavedInstanceState(savedInstanceState: Bundle) = - savedInstanceState.getSerializable(KEY_STATE) as State + private fun buildStateFromSavedInstanceState(savedInstanceState: Bundle) = requireNotNull( + savedInstanceState.getSerializableCompat(KEY_STATE) + ) private fun buildStateFromAccountStore() = accountStore.account?.let { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginSiteCheckErrorFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginSiteCheckErrorFragment.kt index 8e78cdb78f0d..81646d32dd90 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginSiteCheckErrorFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/login/jetpack/LoginSiteCheckErrorFragment.kt @@ -3,7 +3,7 @@ package org.wordpress.android.ui.accounts.login.jetpack import android.content.Context import android.os.Bundle import android.view.View -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint @@ -54,7 +54,7 @@ class LoginSiteCheckErrorFragment : Fragment(R.layout.jetpack_login_empty_view) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initBackPressHandler() + requireActivity().onBackPressedDispatcher.addCallback(this) { viewModel.onBackPressed() } with(JetpackLoginEmptyViewBinding.bind(view)) { ActivityUtils.hideKeyboardForced(view) initErrorMessageView() @@ -113,16 +113,4 @@ class LoginSiteCheckErrorFragment : Fragment(R.layout.jetpack_login_empty_view) unifiedLoginTracker.track(step = Step.NOT_A_JETPACK_SITE) } - - private fun initBackPressHandler() { - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback( - true - ) { - override fun handleOnBackPressed() { - viewModel.onBackPressed() - } - }) - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailActivity.kt index 38c9e1c9924f..981d9833b900 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailActivity.kt @@ -25,7 +25,7 @@ class ActivityLogDetailActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt index b542ce477863..36956d10766e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/detail/ActivityLogDetailFragment.kt @@ -28,6 +28,8 @@ import org.wordpress.android.ui.notifications.utils.NotificationsUtilsWrapper import org.wordpress.android.ui.reader.tracker.ReaderTracker import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.JetpackBrandingUtils +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.models.JetpackPoweredScreen import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.image.ImageType.AVATAR_WITH_BACKGROUND @@ -221,7 +223,9 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { private fun sideAndActivityId(savedInstanceState: Bundle?, intent: Intent?) = when { savedInstanceState != null -> { - val site = savedInstanceState.getSerializable(WordPress.SITE) as SiteModel + val site = requireNotNull( + savedInstanceState.getSerializableCompat(WordPress.SITE) + ) val activityLogId = requireNotNull( savedInstanceState.getString( ACTIVITY_LOG_ID_KEY @@ -230,7 +234,9 @@ class ActivityLogDetailFragment : Fragment(R.layout.activity_log_item_detail) { site to activityLogId } intent != null -> { - val site = intent.getSerializableExtra(WordPress.SITE) as SiteModel + val site = requireNotNull( + intent.getSerializableExtraCompat(WordPress.SITE) + ) val activityLogId = intent.getStringExtra(ACTIVITY_LOG_ID_KEY) as String site to activityLogId } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListActivity.kt index b944b25eadcd..abcb2aa59998 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListActivity.kt @@ -108,7 +108,7 @@ class ActivityLogListActivity : LocaleAwareActivity(), ScrollableViewInitialized override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt index 473037a21c0b..c2a1e68566f3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/activitylog/list/ActivityLogListFragment.kt @@ -29,6 +29,8 @@ import org.wordpress.android.ui.prefs.EmptyViewRecyclerView import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.NetworkUtils import org.wordpress.android.util.WPSwipeToRefreshHelper.buildSwipeToRefreshHelper +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.helpers.SwipeToRefreshHelper import org.wordpress.android.viewmodel.activitylog.ACTIVITY_LOG_REWINDABLE_ONLY_KEY import org.wordpress.android.viewmodel.activitylog.ActivityLogViewModel @@ -73,7 +75,7 @@ class ActivityLogListFragment : Fragment(R.layout.activity_log_list_fragment) { viewModel = ViewModelProvider( this@ActivityLogListFragment, viewModelFactory - ).get(ActivityLogViewModel::class.java) + )[ActivityLogViewModel::class.java] with(ActivityLogListFragmentBinding.bind(view)) { listView = logListView @@ -87,12 +89,14 @@ class ActivityLogListFragment : Fragment(R.layout.activity_log_list_fragment) { } } - val site = if (savedInstanceState == null) { - val nonNullIntent = checkNotNull(nonNullActivity.intent) - nonNullIntent.getSerializableExtra(WordPress.SITE) as SiteModel - } else { - savedInstanceState.getSerializable(WordPress.SITE) as SiteModel - } + val site = requireNotNull( + if (savedInstanceState == null) { + val nonNullIntent = checkNotNull(nonNullActivity.intent) + nonNullIntent.getSerializableExtraCompat(WordPress.SITE) + } else { + savedInstanceState.getSerializableCompat(WordPress.SITE) + } + ) val rewindableOnly = nonNullActivity.intent.getBooleanExtra(ACTIVITY_LOG_REWINDABLE_ONLY_KEY, false) logListView.setEmptyView(actionableEmptyView) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/blaze/BlazeParentActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/blaze/BlazeParentActivity.kt index dcddc767ea3c..031fdf84bf64 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/blaze/BlazeParentActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/blaze/BlazeParentActivity.kt @@ -8,6 +8,8 @@ import org.wordpress.android.R import org.wordpress.android.ui.blaze.ui.blazeoverlay.BlazeOverlayFragment import org.wordpress.android.ui.blaze.ui.blazeoverlay.BlazeViewModel import org.wordpress.android.ui.blaze.ui.blazewebview.BlazeWebViewFragment +import org.wordpress.android.util.extensions.getParcelableExtraCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat const val ARG_EXTRA_BLAZE_UI_MODEL = "blaze_ui_model" const val ARG_BLAZE_FLOW_SOURCE = "blaze_flow_source" @@ -45,10 +47,10 @@ class BlazeParentActivity : AppCompatActivity() { } private fun getSource(): BlazeFlowSource { - return intent.getSerializableExtra(ARG_BLAZE_FLOW_SOURCE) as BlazeFlowSource + return requireNotNull(intent.getSerializableExtraCompat(ARG_BLAZE_FLOW_SOURCE)) } private fun getBlazeUiModel(): BlazeUIModel? { - return intent.getParcelableExtra(ARG_EXTRA_BLAZE_UI_MODEL) + return intent.getParcelableExtraCompat(ARG_EXTRA_BLAZE_UI_MODEL) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt index 7771b6f351bc..5e2ac3f8c626 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt @@ -41,6 +41,7 @@ import org.wordpress.android.util.SnackbarItem.Action import org.wordpress.android.util.SnackbarItem.Info import org.wordpress.android.util.SnackbarSequencer import org.wordpress.android.util.extensions.exhaustive +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -96,9 +97,7 @@ class BloggingPromptsOnboardingDialogFragment : FeatureIntroductionDialogFragmen @Suppress("UseCheckOrError") override fun onAttach(context: Context) { super.onAttach(context) - arguments?.let { - dialogType = it.getSerializable(KEY_DIALOG_TYPE) as DialogType - } + arguments?.let { dialogType = requireNotNull(it.getSerializableCompat(KEY_DIALOG_TYPE)) } (requireActivity().applicationContext as WordPress).component().inject(this) if (dialogType == ONBOARDING && context !is BloggingPromptsReminderSchedulerListener) { throw IllegalStateException( diff --git a/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/promptslist/BloggingPromptsListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/promptslist/BloggingPromptsListActivity.kt index 1f47dbdfd643..f8f13b932d6e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/promptslist/BloggingPromptsListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/promptslist/BloggingPromptsListActivity.kt @@ -26,7 +26,11 @@ class BloggingPromptsListActivity : LocaleAwareActivity() { setContent { AppTheme { val uiState by viewModel.uiStateFlow.collectAsState() - BloggingPromptsListScreen(uiState, ::onBackPressed, viewModel::onPromptListItemClicked) + BloggingPromptsListScreen( + uiState, + { onBackPressedDispatcher.onBackPressed() }, + viewModel::onPromptListItemClicked + ) } } observeActions() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt index 0d84aa28fba8..9ee9631943b7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt @@ -18,6 +18,7 @@ import org.wordpress.android.ui.bloggingreminders.BloggingRemindersAnalyticsTrac import org.wordpress.android.ui.bloggingreminders.BloggingRemindersAnalyticsTracker.Source.PUBLISH_FLOW import org.wordpress.android.ui.utils.ListItemInteraction import org.wordpress.android.ui.utils.UiString +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.merge import org.wordpress.android.util.perform import org.wordpress.android.viewmodel.Event @@ -220,9 +221,7 @@ class BloggingRemindersViewModel @Inject constructor( } fun restoreState(state: Bundle) { - state.getSerializable(SELECTED_SCREEN)?.let { - _selectedScreen.value = it as Screen - } + state.getSerializableCompat(SELECTED_SCREEN)?.let { _selectedScreen.value = it } val siteId = state.getInt(SITE_ID) if (siteId != 0) { val enabledDays = state.getStringArrayList(SELECTED_DAYS)?.map { DayOfWeek.valueOf(it) }?.toSet() ?: setOf() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsDetailActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsDetailActivity.java index cd37f943beb6..f4348e7d239c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsDetailActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsDetailActivity.java @@ -8,6 +8,7 @@ import android.view.View; import android.widget.ProgressBar; +import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; import androidx.viewpager.widget.ViewPager; @@ -38,6 +39,7 @@ import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; import org.wordpress.android.util.analytics.AnalyticsUtils.AnalyticsCommentActionSource; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.widgets.WPViewPager; import org.wordpress.android.widgets.WPViewPagerTransformer; @@ -73,18 +75,6 @@ public class CommentsDetailActivity extends LocaleAwareActivity private boolean mIsUpdatingComments; private boolean mCanLoadMoreComments = true; - @Override - public void onBackPressed() { - CollapseFullScreenDialogFragment fragment = (CollapseFullScreenDialogFragment) - getSupportFragmentManager().findFragmentByTag(CollapseFullScreenDialogFragment.TAG); - - if (fragment != null) { - fragment.onBackPressed(); - } else { - super.onBackPressed(); - } - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -94,6 +84,21 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.comments_detail_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + CollapseFullScreenDialogFragment fragment = (CollapseFullScreenDialogFragment) + getSupportFragmentManager().findFragmentByTag(CollapseFullScreenDialogFragment.TAG); + + if (fragment != null) { + fragment.collapse(); + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + Toolbar toolbar = findViewById(R.id.toolbar_main); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/EditCommentActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/comments/EditCommentActivity.java index 83a59cc8fbf2..af88e79c01ae 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/EditCommentActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/EditCommentActivity.java @@ -13,6 +13,7 @@ import android.widget.EditText; import android.widget.ProgressBar; +import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; @@ -41,6 +42,7 @@ import org.wordpress.android.util.EditTextUtils; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import javax.inject.Inject; @@ -73,6 +75,19 @@ public void onCreate(Bundle icicle) { ((WordPress) getApplication()).component().inject(this); setContentView(R.layout.comment_edit_activity); + + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (isCommentEdited()) { + cancelEditCommentConfirmation(); + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + Toolbar toolbar = findViewById(R.id.toolbar_main); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); @@ -194,7 +209,7 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(final MenuItem item) { int i = item.getItemId(); if (i == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } else if (i == R.id.menu_save_comment) { saveComment(); @@ -293,15 +308,6 @@ private void setFetchProgressVisible(boolean progressVisible) { editContainer.setVisibility(progressVisible ? View.GONE : View.VISIBLE); } - @Override - public void onBackPressed() { - if (isCommentEdited()) { - cancelEditCommentConfirmation(); - } else { - super.onBackPressed(); - } - } - private void cancelEditCommentConfirmation() { if (mCancelEditCommentDialog != null) { mCancelEditCommentDialog.show(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/CommentListActionModeCallback.kt b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/CommentListActionModeCallback.kt index 0db7bbf278e0..05708b9972ae 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/CommentListActionModeCallback.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/CommentListActionModeCallback.kt @@ -73,9 +73,10 @@ class CommentListActionModeCallback( private fun setItemEnabled(menuItem: MenuItem, actionUiModel: ActionUiModel) { menuItem.isVisible = actionUiModel.isVisible menuItem.isEnabled = actionUiModel.isEnabled - if (menuItem.icon != null) { + val currentIcon = menuItem.icon + currentIcon?.let { // must mutate the drawable to avoid affecting other instances of it - val icon = menuItem.icon.mutate() + val icon = it.mutate() icon.alpha = if (actionUiModel.isEnabled) ICON_ALPHA_ENABLED else ICON_ALPHA_DISABLED menuItem.icon = icon } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt index 67259b28128d..3c91ccf6ea39 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt @@ -33,6 +33,7 @@ import org.wordpress.android.util.SnackbarItem.Info import org.wordpress.android.util.SnackbarSequencer import org.wordpress.android.util.WPSwipeToRefreshHelper import org.wordpress.android.util.config.UnifiedCommentsDetailFeatureConfig +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.helpers.SwipeToRefreshHelper import javax.inject.Inject @@ -70,13 +71,13 @@ class UnifiedCommentListFragment : Fragment(R.layout.unified_comment_list_fragme override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (requireActivity().application as WordPress).component().inject(this) - viewModel = ViewModelProvider(this, viewModelFactory).get(UnifiedCommentListViewModel::class.java) + viewModel = ViewModelProvider(this, viewModelFactory)[UnifiedCommentListViewModel::class.java] activityViewModel = ViewModelProvider( requireActivity(), viewModelFactory - ).get(UnifiedCommentActivityViewModel::class.java) + )[UnifiedCommentActivityViewModel::class.java] arguments?.let { - commentListFilter = it.getSerializable(KEY_COMMENT_LIST_FILTER) as CommentFilter + commentListFilter = requireNotNull(it.getSerializableCompat(KEY_COMMENT_LIST_FILTER)) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsActivity.kt index e87cc567be71..4381983c9e73 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsActivity.kt @@ -116,7 +116,7 @@ class UnifiedCommentsActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditActivity.kt index 807718b2c3a3..d8a4e70dab6f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditActivity.kt @@ -8,6 +8,8 @@ import org.wordpress.android.WordPress import org.wordpress.android.databinding.UnifiedCommentsEditActivityBinding import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.ui.LocaleAwareActivity +import org.wordpress.android.util.extensions.getParcelableExtraCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat class UnifiedCommentsEditActivity : LocaleAwareActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -17,8 +19,10 @@ class UnifiedCommentsEditActivity : LocaleAwareActivity() { setContentView(root) } - val site = intent.getSerializableExtra(WordPress.SITE) as SiteModel - val commentIdentifier = requireNotNull(intent.getParcelableExtra(KEY_COMMENT_IDENTIFIER)) + val site = requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) + val commentIdentifier = requireNotNull( + intent.getParcelableExtraCompat(KEY_COMMENT_IDENTIFIER) + ) val fm = supportFragmentManager var editCommentFragment = fm.findFragmentByTag( diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt index 704f3c1d03b1..90d5addf8199 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt @@ -6,7 +6,7 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.core.view.MenuProvider import androidx.core.widget.doAfterTextChanged @@ -34,6 +34,8 @@ import org.wordpress.android.util.SnackbarItem import org.wordpress.android.util.SnackbarItem.Action import org.wordpress.android.util.SnackbarItem.Info import org.wordpress.android.util.SnackbarSequencer +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -61,11 +63,9 @@ class UnifiedCommentsEditFragment : Fragment(R.layout.unified_comments_edit_frag super.onViewCreated(view, savedInstanceState) requireActivity().addMenuProvider(this, viewLifecycleOwner) - val site = requireArguments().getSerializable(WordPress.SITE) as SiteModel + val site = requireNotNull(arguments?.getSerializableCompat(WordPress.SITE)) val commentIdentifier = requireNotNull( - requireArguments().getParcelable( - KEY_COMMENT_IDENTIFIER - ) + requireArguments().getParcelableCompat(KEY_COMMENT_IDENTIFIER) ) UnifiedCommentsEditFragmentBinding.bind(view).apply { @@ -82,15 +82,7 @@ class UnifiedCommentsEditFragment : Fragment(R.layout.unified_comments_edit_frag it.setDisplayHomeAsUpEnabled(true) it.setHomeAsUpIndicator(R.drawable.ic_cross_white_24dp) } - activity.onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback( - true - ) { - override fun handleOnBackPressed() { - viewModel.onBackPressed() - } - }) + activity.onBackPressedDispatcher.addCallback(this@UnifiedCommentsEditFragment) { viewModel.onBackPressed() } } private fun hideKeyboard() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt index f344f01d6256..87de1bfdb12a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/debug/DebugSettingsActivity.kt @@ -13,7 +13,7 @@ class DebugSettingsActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/debug/cookies/DebugCookiesActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/debug/cookies/DebugCookiesActivity.kt index 569b62f095ea..1772ba413e06 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/debug/cookies/DebugCookiesActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/debug/cookies/DebugCookiesActivity.kt @@ -13,7 +13,7 @@ class DebugCookiesActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { android.R.id.home -> { - onBackPressed() + onBackPressedDispatcher.onBackPressed() true } else -> super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverActivity.java index 5da594ae58eb..28066e7cf893 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverActivity.java @@ -4,6 +4,7 @@ import android.net.Uri; import android.os.Bundle; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.lifecycle.ViewModelProvider; @@ -20,6 +21,7 @@ import org.wordpress.android.util.PackageManagerWrapper; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.UriWrapper; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import javax.inject.Inject; @@ -49,6 +51,16 @@ public class DeepLinkingIntentReceiverActivity extends LocaleAwareActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + finish(); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + mViewModel = new ViewModelProvider(this).get(DeepLinkingIntentReceiverViewModel.class); mJetpackFullScreenViewModel = new ViewModelProvider(this).get(JetpackFeatureFullScreenOverlayViewModel.class); setupObservers(); @@ -139,10 +151,4 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { finish(); } } - - @Override - public void onBackPressed() { - super.onBackPressed(); - finish(); - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverViewModel.kt index 1d9c7c6e06c1..978c941d4251 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverViewModel.kt @@ -20,6 +20,7 @@ import org.wordpress.android.ui.deeplinks.handlers.DeepLinkHandlers import org.wordpress.android.ui.deeplinks.handlers.ServerTrackingHandler import org.wordpress.android.util.UriWrapper import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ScopedViewModel import javax.inject.Inject @@ -147,12 +148,11 @@ class DeepLinkingIntentReceiverViewModel private fun extractSavedInstanceStateIfNeeded(savedInstanceState: Bundle?) { savedInstanceState?.let { - val uri: Uri? = savedInstanceState.getParcelable(URI_KEY) + val uri = savedInstanceState.getParcelableCompat(URI_KEY) uriWrapper = uri?.let { UriWrapper(it) } - deepLinkEntryPoint = - DeepLinkEntryPoint.valueOf( - savedInstanceState.getString(DEEP_LINK_ENTRY_POINT_KEY, DeepLinkEntryPoint.DEFAULT.name) - ) + deepLinkEntryPoint = DeepLinkEntryPoint.valueOf( + savedInstanceState.getString(DEEP_LINK_ENTRY_POINT_KEY, DeepLinkEntryPoint.DEFAULT.name) + ) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationActivity.kt index 30e777de2edf..e9e56dbf80fc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationActivity.kt @@ -17,6 +17,7 @@ import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenD import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationDetails import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationResult import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainSuggestions +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -50,9 +51,10 @@ class DomainRegistrationActivity : LocaleAwareActivity(), ScrollableViewInitiali setContentView(root) binding = this - val site = intent.getSerializableExtra(WordPress.SITE) as SiteModel - val domainRegistrationPurpose = intent.getSerializableExtra(DOMAIN_REGISTRATION_PURPOSE_KEY) - as DomainRegistrationPurpose + val site = requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) + val domainRegistrationPurpose = requireNotNull( + intent.getSerializableExtraCompat(DOMAIN_REGISTRATION_PURPOSE_KEY) + ) setupToolbar() setupViewModel(site, domainRegistrationPurpose) @@ -134,7 +136,7 @@ class DomainRegistrationActivity : LocaleAwareActivity(), ScrollableViewInitiali override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationDetailsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationDetailsFragment.kt index 459c93964a19..60d8e7d04710 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationDetailsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationDetailsFragment.kt @@ -47,6 +47,7 @@ import org.wordpress.android.ui.domains.DomainRegistrationDetailsViewModel.Domai import org.wordpress.android.util.StringUtils import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.WPUrlUtils +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject class DomainRegistrationDetailsFragment : Fragment() { @@ -89,10 +90,11 @@ class DomainRegistrationDetailsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainViewModel = ViewModelProvider(requireActivity(), viewModelFactory) - .get(DomainRegistrationMainViewModel::class.java) - viewModel = ViewModelProvider(this, viewModelFactory) - .get(DomainRegistrationDetailsViewModel::class.java) + mainViewModel = ViewModelProvider( + requireActivity(), + viewModelFactory + )[DomainRegistrationMainViewModel::class.java] + viewModel = ViewModelProvider(this, viewModelFactory)[DomainRegistrationDetailsViewModel::class.java] with(DomainRegistrationDetailsFragmentBinding.bind(view)) { binding = this setupObservers() @@ -100,7 +102,7 @@ class DomainRegistrationDetailsFragment : Fragment() { val domainProductDetails = requireNotNull( arguments?.getParcelable(EXTRA_DOMAIN_PRODUCT_DETAILS) ) - val site = requireActivity().intent?.getSerializableExtra(WordPress.SITE) as SiteModel + val site = requireNotNull(activity?.intent?.getSerializableExtraCompat(WordPress.SITE)) viewModel.start(site, domainProductDetails) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationResultFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationResultFragment.kt index b0691a90e18d..68f8fa0d1ae1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationResultFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationResultFragment.kt @@ -2,7 +2,7 @@ package org.wordpress.android.ui.domains import android.os.Bundle import android.view.View -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.core.text.HtmlCompat.FROM_HTML_MODE_COMPACT import androidx.core.text.parseAsHtml @@ -49,8 +49,8 @@ class DomainRegistrationResultFragment : Fragment(R.layout.domain_registration_r with(DomainRegistrationResultFragmentBinding.bind(view)) { setupViews(domainName, email) - setupObservers(domainName, email) } + requireActivity().onBackPressedDispatcher.addCallback(this) { finishRegistration(domainName, email) } } private fun setupWindow() = with(requireAppCompatActivity()) { @@ -78,14 +78,6 @@ class DomainRegistrationResultFragment : Fragment(R.layout.domain_registration_r ).parseAsHtml(FROM_HTML_MODE_COMPACT) } - private fun setupObservers(domainName: String, email: String) = with(requireActivity()) { - onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - finishRegistration(domainName, email) - } - }) - } - private fun finishRegistration(domainName: String, email: String) { mainViewModel.finishDomainRegistration(DomainRegistrationCompletedEvent(domainName, email)) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainSuggestionsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainSuggestionsFragment.kt index 09d64744f0b1..c96d63dedaf4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainSuggestionsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainSuggestionsFragment.kt @@ -18,6 +18,7 @@ import org.wordpress.android.ui.ScrollableViewInitializedListener import org.wordpress.android.ui.domains.DomainRegistrationActivity.Companion.DOMAIN_REGISTRATION_PURPOSE_KEY import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose import org.wordpress.android.util.ToastUtils +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -38,17 +39,19 @@ class DomainSuggestionsFragment : Fragment(R.layout.domain_suggestions_fragment) super.onViewCreated(view, savedInstanceState) (requireActivity().application as WordPress).component().inject(this) - mainViewModel = ViewModelProvider(requireActivity(), viewModelFactory) - .get(DomainRegistrationMainViewModel::class.java) + mainViewModel = ViewModelProvider( + requireActivity(), + viewModelFactory + )[DomainRegistrationMainViewModel::class.java] - viewModel = ViewModelProvider(this, viewModelFactory) - .get(DomainSuggestionsViewModel::class.java) + viewModel = ViewModelProvider(this, viewModelFactory)[DomainSuggestionsViewModel::class.java] with(DomainSuggestionsFragmentBinding.bind(view)) { val intent = requireActivity().intent - val site = intent.getSerializableExtra(WordPress.SITE) as SiteModel - val domainRegistrationPurpose = intent.getSerializableExtra(DOMAIN_REGISTRATION_PURPOSE_KEY) - as DomainRegistrationPurpose + val site = requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) + val domainRegistrationPurpose = requireNotNull( + intent.getSerializableExtraCompat(DOMAIN_REGISTRATION_PURPOSE_KEY) + ) setupViews() setupObservers() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardActivity.kt index b7a81a7e8f6b..9a8b55e2331e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardActivity.kt @@ -24,7 +24,7 @@ class DomainsDashboardActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardFragment.kt index b656a32509b2..79dff8216353 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/domains/DomainsDashboardFragment.kt @@ -18,6 +18,7 @@ import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistr import org.wordpress.android.ui.domains.DomainsDashboardNavigationAction.ClaimDomain import org.wordpress.android.ui.domains.DomainsDashboardNavigationAction.GetDomain import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -46,8 +47,8 @@ class DomainsDashboardFragment : Fragment(R.layout.domains_dashboard_fragment) { private fun setupViewModel() { val intent = requireActivity().intent - val site = intent.getSerializableExtra(WordPress.SITE) as SiteModel - viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(DomainsDashboardViewModel::class.java) + val site = requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) + viewModel = ViewModelProvider(requireActivity(), viewModelFactory)[DomainsDashboardViewModel::class.java] viewModel.start(site) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListActivity.kt index f96bcad38ac6..36c4417a872a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListActivity.kt @@ -7,6 +7,7 @@ import org.wordpress.android.WordPress import org.wordpress.android.databinding.EngagedPeopleListActivityBinding import org.wordpress.android.ui.LocaleAwareActivity import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper +import org.wordpress.android.util.extensions.getParcelableExtraCompat import javax.inject.Inject class EngagedPeopleListActivity : LocaleAwareActivity() { @@ -22,7 +23,7 @@ class EngagedPeopleListActivity : LocaleAwareActivity() { setSupportActionBar(toolbarMain) } - val listScenario = intent.getParcelableExtra(KEY_LIST_SCENARIO) + val listScenario = intent.getParcelableExtraCompat(KEY_LIST_SCENARIO) ?: throw IllegalArgumentException( "List Scenario cannot be null. Make sure to pass a valid List Scenario in the intent" ) @@ -59,7 +60,7 @@ class EngagedPeopleListActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt index fb0b3bbbed83..3c5937d693f3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt @@ -39,6 +39,7 @@ import org.wordpress.android.util.SnackbarItem.Info import org.wordpress.android.util.SnackbarSequencer import org.wordpress.android.util.WPUrlUtils import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.observeEvent @@ -93,17 +94,17 @@ class EngagedPeopleListFragment : Fragment() { loadingView = view.findViewById(R.id.loading_view) emptyView = view.findViewById(R.id.actionable_empty_view) - val listScenario = requireArguments().getParcelable(KEY_LIST_SCENARIO) + val listScenario = requireNotNull(arguments?.getParcelableCompat(KEY_LIST_SCENARIO)) val layoutManager = LinearLayoutManager(activity) - savedInstanceState?.getParcelable(KEY_LIST_STATE)?.let { + savedInstanceState?.getParcelableCompat(KEY_LIST_STATE)?.let { layoutManager.onRestoreInstanceState(it) } recycler.layoutManager = layoutManager - userProfileViewModel.onBottomSheetAction.observeEvent(viewLifecycleOwner, { state -> + userProfileViewModel.onBottomSheetAction.observeEvent(viewLifecycleOwner) { state -> var bottomSheet = childFragmentManager.findFragmentByTag(USER_PROFILE_BOTTOM_SHEET_TAG) as? UserProfileBottomSheetFragment @@ -118,33 +119,33 @@ class EngagedPeopleListFragment : Fragment() { bottomSheet?.apply { this.dismiss() } } } - }) + } - viewModel.uiState.observe(viewLifecycleOwner, { state -> + viewModel.uiState.observe(viewLifecycleOwner) { state -> if (!isAdded) return@observe updateUiState(state) - }) + } - viewModel.onNavigationEvent.observeEvent(viewLifecycleOwner, { event -> + viewModel.onNavigationEvent.observeEvent(viewLifecycleOwner) { event -> if (!isAdded) return@observeEvent manageNavigation(event) - }) + } - viewModel.onSnackbarMessage.observeEvent(viewLifecycleOwner, { messageHolder -> + viewModel.onSnackbarMessage.observeEvent(viewLifecycleOwner) { messageHolder -> if (!isAdded || !lifecycle.currentState.isAtLeast(State.RESUMED)) return@observeEvent showSnackbar(messageHolder) - }) + } - viewModel.onServiceRequestEvent.observeEvent(viewLifecycleOwner, { serviceRequest -> + viewModel.onServiceRequestEvent.observeEvent(viewLifecycleOwner) { serviceRequest -> if (!isAdded) return@observeEvent manageServiceRequest(serviceRequest) - }) + } - viewModel.start(listScenario!!) + viewModel.start(listScenario) } @Suppress("ForbiddenComment") diff --git a/WordPress/src/main/java/org/wordpress/android/ui/featureintroduction/FeatureIntroductionDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/featureintroduction/FeatureIntroductionDialogFragment.kt index 2806fdf6fc22..f2e8a2e41dbf 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/featureintroduction/FeatureIntroductionDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/featureintroduction/FeatureIntroductionDialogFragment.kt @@ -5,6 +5,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.ComponentDialog +import androidx.activity.addCallback import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.fragment.app.DialogFragment @@ -13,6 +15,7 @@ import org.wordpress.android.R import org.wordpress.android.analytics.AnalyticsTracker.Stat import org.wordpress.android.databinding.FeatureIntroductionDialogFragmentBinding import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.util.extensions.onBackPressedCompat import org.wordpress.android.util.extensions.setStatusBarAsSurfaceColor import javax.inject.Inject @@ -31,12 +34,11 @@ abstract class FeatureIntroductionDialogFragment : DialogFragment() { } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = - object : Dialog(requireContext(), theme) { - override fun onBackPressed() { + super.onCreateDialog(savedInstanceState).apply { + (this as ComponentDialog).onBackPressedDispatcher.addCallback(this@FeatureIntroductionDialogFragment) { viewModel.onBackButtonClick() - super.onBackPressed() + onBackPressedDispatcher.onBackPressedCompat(this) } - }.apply { setStatusBarAsSurfaceColor() } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailActivity.kt index 1f8537ee3772..09f053a4982a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailActivity.kt @@ -1,12 +1,15 @@ package org.wordpress.android.ui.history import android.os.Bundle +import androidx.activity.addCallback import org.wordpress.android.R import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.analytics.AnalyticsTracker.Stat import org.wordpress.android.databinding.HistoryDetailActivityBinding import org.wordpress.android.ui.LocaleAwareActivity import org.wordpress.android.ui.history.HistoryListItem.Revision +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.onBackPressedCompat class HistoryDetailActivity : LocaleAwareActivity() { companion object { @@ -19,10 +22,16 @@ class HistoryDetailActivity : LocaleAwareActivity() { setContentView(root) setSupportActionBar(toolbarMain) } + + onBackPressedDispatcher.addCallback(this) { + AnalyticsTracker.track(Stat.REVISIONS_DETAIL_CANCELLED) + onBackPressedDispatcher.onBackPressedCompat(this) + } + supportActionBar?.setDisplayHomeAsUpEnabled(true) val extras = requireNotNull(intent.extras) - val revision = extras.getParcelable(HistoryDetailContainerFragment.EXTRA_CURRENT_REVISION) + val revision = extras.getParcelableCompat(HistoryDetailContainerFragment.EXTRA_CURRENT_REVISION) val previousRevisionsIds = extras.getLongArray(HistoryDetailContainerFragment.EXTRA_PREVIOUS_REVISIONS_IDS) val postId = extras.getLong(HistoryDetailContainerFragment.EXTRA_POST_ID) @@ -44,9 +53,4 @@ class HistoryDetailActivity : LocaleAwareActivity() { finish() return true } - - override fun onBackPressed() { - AnalyticsTracker.track(Stat.REVISIONS_DETAIL_CANCELLED) - super.onBackPressed() - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailFragment.kt index 3b1db67f62cc..64c8a4072b0c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/history/HistoryDetailFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import org.wordpress.android.R import org.wordpress.android.ui.history.HistoryListItem.Revision +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.widgets.DiffView class HistoryDetailFragment : Fragment() { @@ -16,9 +17,9 @@ class HistoryDetailFragment : Fragment() { super.onCreate(savedInstanceState) mRevision = if (savedInstanceState != null) { - savedInstanceState.getParcelable(KEY_REVISION) + savedInstanceState.getParcelableCompat(KEY_REVISION) } else { - arguments?.getParcelable(EXTRA_REVISION) + arguments?.getParcelableCompat(EXTRA_REVISION) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadActivity.kt index 1b84f71d463f..e240c9bea30b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadActivity.kt @@ -18,7 +18,7 @@ class BackupDownloadActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt index fafe0b4f4249..7c8914fee3fd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt @@ -5,7 +5,7 @@ import android.app.Activity.RESULT_OK import android.content.Intent import android.os.Bundle import android.view.View -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider @@ -27,6 +27,7 @@ import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import org.wordpress.android.widgets.WPSnackbar @@ -51,7 +52,9 @@ class BackupDownloadFragment : Fragment(R.layout.jetpack_backup_restore_fragment super.onViewCreated(view, savedInstanceState) with(JetpackBackupRestoreFragmentBinding.bind(view)) { initDagger() - initBackPressHandler() + requireActivity().onBackPressedDispatcher.addCallback(this@BackupDownloadFragment) { + viewModel.onBackPressed() + } initAdapter() initViewModel(savedInstanceState) } @@ -61,22 +64,6 @@ class BackupDownloadFragment : Fragment(R.layout.jetpack_backup_restore_fragment (requireActivity().application as WordPress).component().inject(this) } - private fun initBackPressHandler() { - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback( - true - ) { - override fun handleOnBackPressed() { - onBackPressed() - } - }) - } - - private fun onBackPressed() { - viewModel.onBackPressed() - } - private fun JetpackBackupRestoreFragmentBinding.initAdapter() { recyclerView.adapter = JetpackBackupRestoreAdapter(imageManager, uiHelpers) recyclerView.itemAnimator = null @@ -89,11 +76,13 @@ class BackupDownloadFragment : Fragment(R.layout.jetpack_backup_restore_fragment viewModel = ViewModelProvider( this@BackupDownloadFragment, viewModelFactory - ).get(BackupDownloadViewModel::class.java) + )[BackupDownloadViewModel::class.java] val (site, activityId) = when { requireActivity().intent?.extras != null -> { - val site = requireNotNull(requireActivity().intent.extras).getSerializable(WordPress.SITE) as SiteModel + val site = requireNotNull( + requireActivity().intent.extras?.getSerializableCompat(WordPress.SITE) + ) val activityId = requireNotNull(requireActivity().intent.extras).getString( KEY_BACKUP_DOWNLOAD_ACTIVITY_ID_KEY ) as String diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModel.kt index 3ea0109e2d30..cbbefc8ec3e5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModel.kt @@ -58,6 +58,7 @@ import org.wordpress.android.ui.jetpack.usecases.GetActivityLogItemUseCase import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.ui.utils.UiString.UiStringText +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.text.PercentFormatter import org.wordpress.android.util.wizard.WizardManager import org.wordpress.android.util.wizard.WizardNavigationTarget @@ -139,7 +140,7 @@ class BackupDownloadViewModel @Inject constructor( // Show the next step only if it's a fresh activity so we can handle the navigation wizardManager.showNextStep() } else { - backupDownloadState = requireNotNull(savedInstanceState.getParcelable(KEY_BACKUP_DOWNLOAD_STATE)) + backupDownloadState = requireNotNull(savedInstanceState.getParcelableCompat(KEY_BACKUP_DOWNLOAD_STATE)) val currentStepIndex = savedInstanceState.getInt(KEY_BACKUP_DOWNLOAD_CURRENT_STEP) wizardManager.setCurrentStepIndex(currentStepIndex) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreActivity.kt index 705aa2ed00b1..436ae6875f5e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreActivity.kt @@ -17,7 +17,7 @@ class RestoreActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return false diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt index 49f05461e035..a9fe86a5eff9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt @@ -5,7 +5,7 @@ import android.app.Activity.RESULT_OK import android.content.Intent import android.os.Bundle import android.view.View -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider @@ -27,6 +27,7 @@ import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import org.wordpress.android.widgets.WPSnackbar @@ -50,7 +51,7 @@ class RestoreFragment : Fragment(R.layout.jetpack_backup_restore_fragment) { super.onViewCreated(view, savedInstanceState) with(JetpackBackupRestoreFragmentBinding.bind(view)) { initDagger() - initBackPressHandler() + requireActivity().onBackPressedDispatcher.addCallback(this@RestoreFragment) { viewModel.onBackPressed() } initAdapter() initViewModel(savedInstanceState) } @@ -60,22 +61,6 @@ class RestoreFragment : Fragment(R.layout.jetpack_backup_restore_fragment) { (requireActivity().application as WordPress).component().inject(this) } - private fun initBackPressHandler() { - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback( - true - ) { - override fun handleOnBackPressed() { - onBackPressed() - } - }) - } - - private fun onBackPressed() { - viewModel.onBackPressed() - } - private fun JetpackBackupRestoreFragmentBinding.initAdapter() { recyclerView.adapter = JetpackBackupRestoreAdapter(imageManager, uiHelpers) recyclerView.itemAnimator = null @@ -85,11 +70,11 @@ class RestoreFragment : Fragment(R.layout.jetpack_backup_restore_fragment) { } private fun JetpackBackupRestoreFragmentBinding.initViewModel(savedInstanceState: Bundle?) { - viewModel = ViewModelProvider(this@RestoreFragment, viewModelFactory).get(RestoreViewModel::class.java) + viewModel = ViewModelProvider(this@RestoreFragment, viewModelFactory)[RestoreViewModel::class.java] val (site, activityId) = when { requireActivity().intent?.extras != null -> { - val site = requireNotNull(requireActivity().intent.extras).getSerializable(WordPress.SITE) as SiteModel + val site = requireNotNull(activity?.intent?.extras?.getSerializableCompat(WordPress.SITE)) val activityId = requireNotNull(requireActivity().intent.extras).getString( KEY_RESTORE_ACTIVITY_ID_KEY ) as String diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModel.kt index 39f3d2422fea..744e81f45b16 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModel.kt @@ -61,6 +61,7 @@ import org.wordpress.android.ui.jetpack.usecases.GetActivityLogItemUseCase import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.ui.utils.UiString.UiStringText +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.text.PercentFormatter import org.wordpress.android.util.wizard.WizardManager import org.wordpress.android.util.wizard.WizardNavigationTarget @@ -142,7 +143,7 @@ class RestoreViewModel @Inject constructor( // Show the next step only if it's a fresh activity so we can handle the navigation wizardManager.showNextStep() } else { - restoreState = requireNotNull(savedInstanceState.getParcelable(KEY_RESTORE_STATE)) + restoreState = requireNotNull(savedInstanceState.getParcelableCompat(KEY_RESTORE_STATE)) val currentStepIndex = savedInstanceState.getInt(KEY_RESTORE_CURRENT_STEP) wizardManager.setCurrentStepIndex(currentStepIndex) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanActivity.kt index bca93e35c0fe..5cad6f80f220 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanActivity.kt @@ -11,13 +11,13 @@ import dagger.hilt.android.AndroidEntryPoint import org.wordpress.android.R import org.wordpress.android.WordPress import org.wordpress.android.databinding.ScanActivityBinding -import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.ui.ActivityLauncher import org.wordpress.android.ui.ScrollableViewInitializedListener import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredBottomSheetFragment import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.JetpackBrandingUtils import org.wordpress.android.models.JetpackPoweredScreen +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject @AndroidEntryPoint @@ -83,11 +83,11 @@ class ScanActivity : AppCompatActivity(), ScrollableViewInitializedListener { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } else if (item.itemId == R.id.menu_scan_history) { // todo malinjir is it worth introducing a vm? - ActivityLauncher.viewScanHistory(this, intent.getSerializableExtra(WordPress.SITE) as SiteModel) + ActivityLauncher.viewScanHistory(this, intent.getSerializableExtraCompat(WordPress.SITE)) } return super.onOptionsItemSelected(item) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanFragment.kt index eda56fb2aa2c..305967806c9c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/ScanFragment.kt @@ -30,6 +30,8 @@ import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.prefs.EmptyViewRecyclerView import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.ColorUtils +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import org.wordpress.android.widgets.WPSnackbar @@ -175,11 +177,14 @@ class ScanFragment : Fragment(R.layout.scan_fragment) { } private fun getSite(savedInstanceState: Bundle?): SiteModel { - return if (savedInstanceState == null) { - requireActivity().intent.getSerializableExtra(WordPress.SITE) as SiteModel - } else { - savedInstanceState.getSerializable(WordPress.SITE) as SiteModel - } + val site = requireNotNull( + if (savedInstanceState == null) { + requireActivity().intent.getSerializableExtraCompat(WordPress.SITE) + } else { + savedInstanceState.getSerializableCompat(WordPress.SITE) + } + ) + return site } override fun onSaveInstanceState(outState: Bundle) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsActivity.kt index eb7b96ab3ff2..14f3c0043f1a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsActivity.kt @@ -20,7 +20,7 @@ class ThreatDetailsActivity : AppCompatActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsFragment.kt index 9aa46a8794ed..85fdefdedeb3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/details/ThreatDetailsFragment.kt @@ -22,6 +22,7 @@ import org.wordpress.android.ui.jetpack.scan.details.ThreatDetailsViewModel.UiSt import org.wordpress.android.ui.jetpack.scan.details.adapters.ThreatDetailsAdapter import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import org.wordpress.android.widgets.WPSnackbar @@ -68,39 +69,33 @@ class ThreatDetailsFragment : Fragment(R.layout.threat_details_fragment) { private fun ThreatDetailsFragmentBinding.setupObservers() { viewModel.uiState.observe( - viewLifecycleOwner, - { uiState -> - if (uiState is Content) { - refreshContentScreen(uiState) - } + viewLifecycleOwner + ) { uiState -> + if (uiState is Content) { + refreshContentScreen(uiState) } - ) - - viewModel.snackbarEvents.observeEvent(viewLifecycleOwner, { it.showSnackbar() }) - - viewModel.navigationEvents.observeEvent( - viewLifecycleOwner, - { events -> - when (events) { - is OpenThreatActionDialog -> showThreatActionDialog(events) - - is ShowUpdatedScanStateWithMessage -> { - val site = requireNotNull(requireActivity().intent.extras) - .getSerializable(WordPress.SITE) as SiteModel - ActivityLauncher.viewScanRequestScanState(requireActivity(), site, events.messageRes) - } - is ShowUpdatedFixState -> { - val site = requireNotNull(requireActivity().intent.extras) - .getSerializable(WordPress.SITE) as SiteModel - ActivityLauncher.viewScanRequestFixState(requireActivity(), site, events.threatId) - } - is ShowGetFreeEstimate -> { - ActivityLauncher.openUrlExternal(context, events.url()) - } - is ShowJetpackSettings -> ActivityLauncher.openUrlExternal(context, events.url) + } + + viewModel.snackbarEvents.observeEvent(viewLifecycleOwner) { it.showSnackbar() } + + viewModel.navigationEvents.observeEvent(viewLifecycleOwner) { events -> + when (events) { + is OpenThreatActionDialog -> showThreatActionDialog(events) + + is ShowUpdatedScanStateWithMessage -> { + val site = requireNotNull(activity?.intent?.extras).getSerializableCompat(WordPress.SITE) + ActivityLauncher.viewScanRequestScanState(requireActivity(), site, events.messageRes) + } + is ShowUpdatedFixState -> { + val site = requireNotNull(activity?.intent?.extras).getSerializableCompat(WordPress.SITE) + ActivityLauncher.viewScanRequestFixState(requireActivity(), site, events.threatId) } + is ShowGetFreeEstimate -> { + ActivityLauncher.openUrlExternal(context, events.url()) + } + is ShowJetpackSettings -> ActivityLauncher.openUrlExternal(context, events.url) } - ) + } } private fun ThreatDetailsFragmentBinding.refreshContentScreen(content: Content) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryFragment.kt index 50174c191801..67ca756018e3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryFragment.kt @@ -20,6 +20,7 @@ import org.wordpress.android.WordPress import org.wordpress.android.databinding.FullscreenErrorWithRetryBinding import org.wordpress.android.databinding.ScanHistoryFragmentBinding import org.wordpress.android.fluxc.model.SiteModel +import org.wordpress.android.models.JetpackPoweredScreen import org.wordpress.android.ui.ScrollableViewInitializedListener import org.wordpress.android.ui.jetpack.scan.history.ScanHistoryViewModel.TabUiState import org.wordpress.android.ui.jetpack.scan.history.ScanHistoryViewModel.UiState.ContentUiState @@ -27,8 +28,9 @@ import org.wordpress.android.ui.jetpack.scan.history.ScanHistoryViewModel.UiStat import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredBottomSheetFragment import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.JetpackBrandingUtils -import org.wordpress.android.models.JetpackPoweredScreen import org.wordpress.android.util.LocaleManagerWrapper +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject @AndroidEntryPoint @@ -121,11 +123,14 @@ class ScanHistoryFragment : Fragment(R.layout.scan_history_fragment), MenuProvid } private fun getSite(savedInstanceState: Bundle?): SiteModel { - return if (savedInstanceState == null) { - requireActivity().intent.getSerializableExtra(WordPress.SITE) as SiteModel - } else { - savedInstanceState.getSerializable(WordPress.SITE) as SiteModel - } + val site = requireNotNull( + if (savedInstanceState == null) { + requireActivity().intent.getSerializableExtraCompat(WordPress.SITE) + } else { + savedInstanceState.getSerializableCompat(WordPress.SITE) + } + ) + return site } override fun onSaveInstanceState(outState: Bundle) { @@ -139,7 +144,7 @@ class ScanHistoryFragment : Fragment(R.layout.scan_history_fragment), MenuProvid override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) { android.R.id.home -> { - requireActivity().onBackPressed() + requireActivity().onBackPressedDispatcher.onBackPressed() true } else -> false diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListFragment.kt index 65346ae58a5d..4017c1043a73 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListFragment.kt @@ -17,6 +17,9 @@ import org.wordpress.android.ui.jetpack.scan.history.ScanHistoryListViewModel.Sc import org.wordpress.android.ui.jetpack.scan.history.ScanHistoryListViewModel.ScanHistoryUiState.EmptyUiState.EmptyHistory import org.wordpress.android.ui.jetpack.scan.history.ScanHistoryViewModel.ScanHistoryTabType import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -78,14 +81,17 @@ class ScanHistoryListFragment : ViewPagerFragment(R.layout.scan_history_list_fra } private fun getSite(savedInstanceState: Bundle?): SiteModel { - return if (savedInstanceState == null) { - requireActivity().intent.getSerializableExtra(WordPress.SITE) as SiteModel - } else { - savedInstanceState.getSerializable(WordPress.SITE) as SiteModel - } + val site = requireNotNull( + if (savedInstanceState == null) { + requireActivity().intent.getSerializableExtraCompat(WordPress.SITE) + } else { + savedInstanceState.getSerializableCompat(WordPress.SITE) + } + ) + return site } - private fun getTabType(): ScanHistoryTabType = requireNotNull(arguments?.getParcelable(ARG_TAB_TYPE)) + private fun getTabType() = requireNotNull(arguments?.getParcelableCompat(ARG_TAB_TYPE)) override fun getScrollableViewForUniqueIdProvision(): View? = binding?.recyclerView diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpackoverlay/JetpackFeatureFullScreenOverlayFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpackoverlay/JetpackFeatureFullScreenOverlayFragment.kt index 0d12c1e9d646..7b8cdae5cb72 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpackoverlay/JetpackFeatureFullScreenOverlayFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpackoverlay/JetpackFeatureFullScreenOverlayFragment.kt @@ -27,6 +27,7 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.RtlUtils import org.wordpress.android.util.UrlUtils import org.wordpress.android.util.extensions.exhaustive +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.extensions.setVisible import javax.inject.Inject @@ -93,23 +94,21 @@ class JetpackFeatureFullScreenOverlayFragment : BottomSheetDialogFragment() { bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED } - private fun getSiteScreen() = - arguments?.getSerializable(OVERLAY_SCREEN_TYPE) as JetpackFeatureOverlayScreenType? + private fun getSiteScreen() = arguments?.getSerializableCompat(OVERLAY_SCREEN_TYPE) - private fun getIfSiteCreationOverlay() = - arguments?.getSerializable(IS_SITE_CREATION_OVERLAY) as Boolean + private fun getIfSiteCreationOverlay() = arguments?.getBoolean(IS_SITE_CREATION_OVERLAY) ?: false - private fun getIfDeepLinkOverlay() = - arguments?.getSerializable(IS_DEEP_LINK_OVERLAY) as Boolean + private fun getIfDeepLinkOverlay() = arguments?.getBoolean(IS_DEEP_LINK_OVERLAY) ?: false - private fun getSiteCreationSource() = - arguments?.getSerializable(SITE_CREATION_OVERLAY_SOURCE) as SiteCreationSource + private fun getSiteCreationSource() = requireNotNull( + arguments?.getSerializableCompat(SITE_CREATION_OVERLAY_SOURCE) + ) - private fun getIfFeatureCollectionOverlay() = - arguments?.getSerializable(IS_FEATURE_COLLECTION_OVERLAY) as Boolean + private fun getIfFeatureCollectionOverlay() = arguments?.getBoolean(IS_FEATURE_COLLECTION_OVERLAY) ?: false - private fun getFeatureCollectionOverlaysSource() = - arguments?.getSerializable(FEATURE_COLLECTION_OVERLAY_SOURCE) as JetpackFeatureCollectionOverlaySource + private fun getFeatureCollectionOverlaysSource() = requireNotNull( + arguments?.getSerializableCompat(FEATURE_COLLECTION_OVERLAY_SOURCE) + ) private fun JetpackFeatureRemovalOverlayBinding.setupObservers() { viewModel.uiState.observe(viewLifecycleOwner) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/fullplugin/onboarding/JetpackFullPluginInstallOnboardingDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/fullplugin/onboarding/JetpackFullPluginInstallOnboardingDialogFragment.kt index c56ef0ef2159..006433b8a7de 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/fullplugin/onboarding/JetpackFullPluginInstallOnboardingDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/fullplugin/onboarding/JetpackFullPluginInstallOnboardingDialogFragment.kt @@ -5,6 +5,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.ComponentDialog +import androidx.activity.addCallback import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -30,6 +32,7 @@ import org.wordpress.android.ui.jetpackplugininstall.fullplugin.onboarding.Jetpa import org.wordpress.android.ui.jetpackplugininstall.fullplugin.onboarding.compose.state.LoadedState import org.wordpress.android.util.WPUrlUtils import org.wordpress.android.util.extensions.exhaustive +import org.wordpress.android.util.extensions.onBackPressedCompat import org.wordpress.android.util.extensions.setStatusBarAsSurfaceColor @AndroidEntryPoint @@ -59,16 +62,15 @@ class JetpackFullPluginInstallOnboardingDialogFragment : DialogFragment() { } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = - object : Dialog(requireContext(), theme) { - override fun onBackPressed() { - viewModel.onDismissScreenClick() - super.onBackPressed() - } - }.apply { + super.onCreateDialog(savedInstanceState).apply { + (this as ComponentDialog).onBackPressedDispatcher + .addCallback(this@JetpackFullPluginInstallOnboardingDialogFragment) { + viewModel.onDismissScreenClick() + onBackPressedDispatcher.onBackPressedCompat(this) + } setStatusBarAsSurfaceColor() } - @Composable private fun JetpackFullPluginInstallOnboardingScreen( viewModel: JetpackFullPluginInstallOnboardingViewModel = viewModel() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/remoteplugin/JetpackRemoteInstallActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/remoteplugin/JetpackRemoteInstallActivity.kt index 8030497795cf..5afc83950d4e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/remoteplugin/JetpackRemoteInstallActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpackplugininstall/remoteplugin/JetpackRemoteInstallActivity.kt @@ -3,6 +3,7 @@ package org.wordpress.android.ui.jetpackplugininstall.remoteplugin import android.app.Activity import android.content.Intent import android.os.Bundle +import androidx.activity.addCallback import androidx.activity.viewModels import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -25,6 +26,9 @@ import org.wordpress.android.ui.jetpackplugininstall.remoteplugin.JetpackRemoteI import org.wordpress.android.ui.jetpackplugininstall.remoteplugin.JetpackRemoteInstallViewModel.JetpackResultActionData.Action.CONTACT_SUPPORT import org.wordpress.android.ui.jetpackplugininstall.remoteplugin.JetpackRemoteInstallViewModel.JetpackResultActionData.Action.LOGIN import org.wordpress.android.ui.jetpackplugininstall.remoteplugin.JetpackRemoteInstallViewModel.JetpackResultActionData.Action.MANUAL_INSTALL +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat +import org.wordpress.android.util.extensions.onBackPressedCompat import org.wordpress.android.util.extensions.setContent @AndroidEntryPoint @@ -38,7 +42,7 @@ class JetpackRemoteInstallActivity : LocaleAwareActivity() { val uiState by viewModel.liveViewState.observeAsState() JetpackPluginInstallScreen( uiState = uiState ?: UiState.Initial(R.string.jetpack_plugin_install_initial_button), - onDismissScreenClick = ::onBackPressed, + onDismissScreenClick = onBackPressedDispatcher::onBackPressed, onInitialButtonClick = viewModel::onInitialButtonClick, onDoneButtonClick = viewModel::onDoneButtonClick, onRetryButtonClick = viewModel::onRetryButtonClick, @@ -47,22 +51,20 @@ class JetpackRemoteInstallActivity : LocaleAwareActivity() { } } initViewModel(savedInstanceState) - } - - override fun onBackPressed() { - if (!viewModel.isBackButtonEnabled()) return + onBackPressedDispatcher.addCallback(this) { + if (!viewModel.isBackButtonEnabled()) return@addCallback - val source = intent.getSerializableExtra(TRACKING_SOURCE_KEY) as JetpackConnectionSource - viewModel.onBackPressed(source) + val source = requireNotNull(intent.getSerializableExtraCompat(TRACKING_SOURCE_KEY)) + viewModel.onBackPressed(source) - super.onBackPressed() + onBackPressedDispatcher.onBackPressedCompat(this) + } } private fun initViewModel(savedInstanceState: Bundle?) { - val site = intent.getSerializableExtra(WordPress.SITE) as SiteModel - val source = intent.getSerializableExtra(TRACKING_SOURCE_KEY) as JetpackConnectionSource - val retrievedState = savedInstanceState - ?.getSerializable(VIEW_STATE) as? JetpackRemoteInstallViewModel.Type + val site = requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) + val source = requireNotNull(intent.getSerializableExtraCompat(TRACKING_SOURCE_KEY)) + val retrievedState = savedInstanceState?.getSerializableCompat(VIEW_STATE) viewModel.initialize(site, retrievedState) viewModel.liveActionOnResult.observe(this) { result -> diff --git a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt index 5444b173a926..9a2115fda4a9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt @@ -15,6 +15,8 @@ import org.wordpress.android.ui.PreviewModeHandler import org.wordpress.android.ui.layoutpicker.LayoutPickerUiState.Content import org.wordpress.android.ui.layoutpicker.LayoutPickerUiState.Error import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.extensions.getParcelableArrayListCompat +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ScopedViewModel import org.wordpress.android.viewmodel.SingleLiveEvent @@ -307,11 +309,11 @@ abstract class LayoutPickerViewModel( fun loadSavedState(savedInstanceState: Bundle?) { if (savedInstanceState == null) return - val layouts = savedInstanceState.getParcelableArrayList(FETCHED_LAYOUTS) - val categories = savedInstanceState.getParcelableArrayList(FETCHED_CATEGORIES) + val layouts = savedInstanceState.getParcelableArrayListCompat(FETCHED_LAYOUTS) + val categories = savedInstanceState.getParcelableArrayListCompat(FETCHED_CATEGORIES) val selected = savedInstanceState.getString(SELECTED_LAYOUT) - val selectedCategories = (savedInstanceState.getSerializable(SELECTED_CATEGORIES) as? List<*>) - ?.filterIsInstance() ?: listOf() + val selectedCategories = (savedInstanceState.getSerializableCompat>(SELECTED_CATEGORIES)) + ?: listOf() val previewMode = savedInstanceState.getString(PREVIEW_MODE, MOBILE.name) resetState(selected, ArrayList(selectedCategories.toMutableList()), previewMode) if (layouts == null || categories == null || layouts.isEmpty()) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutsRowViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutsRowViewHolder.kt index f6a6f69cf547..f63280a6f9b3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutsRowViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutsRowViewHolder.kt @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.OnScrollListener import org.wordpress.android.R import org.wordpress.android.R.dimen +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.extensions.setVisible sealed class LayoutsRowViewHolder(view: View) : RecyclerView.ViewHolder(view) @@ -100,7 +101,7 @@ class LayoutsItemViewHolder( private fun restoreScrollState(recyclerView: RecyclerView, key: String) { recyclerView.layoutManager?.apply { - val scrollState = nestedScrollStates.getParcelable(key) + val scrollState = nestedScrollStates.getParcelableCompat(key) if (scrollState != null) { onRestoreInstanceState(scrollState) } else { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/MeActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/main/MeActivity.kt index d2924eb91d2e..a35fcd146b78 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/MeActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/MeActivity.kt @@ -18,7 +18,7 @@ class MeActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerActivity.java index 85eb8dc5003a..d1fa5dd5ef66 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/SitePickerActivity.java @@ -274,7 +274,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { int itemId = item.getItemId(); if (itemId == android.R.id.home) { AnalyticsTracker.track(Stat.SITE_SWITCHER_DISMISSED); - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } else if (itemId == R.id.menu_edit) { AnalyticsTracker.track(Stat.SITE_SWITCHER_TOGGLED_EDIT_TAPPED, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java index 590379164055..a82abd94e4bf 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainActivity.java @@ -16,6 +16,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationManagerCompat; @@ -150,6 +151,7 @@ import org.wordpress.android.util.config.MySiteDashboardTodaysStatsCardFeatureConfig; import org.wordpress.android.util.config.OpenWebLinksWithJetpackFlowFeatureConfig; import org.wordpress.android.util.config.QRCodeAuthFlowFeatureConfig; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.util.extensions.ViewExtensionsKt; import org.wordpress.android.viewmodel.main.WPMainActivityViewModel; import org.wordpress.android.viewmodel.main.WPMainActivityViewModel.FocusPointInfo; @@ -309,6 +311,7 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); + initBackPressHandler(); mConnectionBar = findViewById(R.id.connection_bar); mConnectionBar.setOnClickListener(v -> { @@ -490,6 +493,30 @@ && getIntent().getExtras().getBoolean(ARG_CONTINUE_JETPACK_CONNECT, false)) { displayJetpackFeatureCollectionOverlayIfNeeded(); } + private void initBackPressHandler() { + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + // let the fragment handle the back button if it implements our OnParentBackPressedListener + if (mBottomNav != null) { + Fragment fragment = mBottomNav.getActiveFragment(); + if (fragment instanceof OnActivityBackPressedListener) { + boolean handled = ((OnActivityBackPressedListener) fragment).onActivityBackPressed(); + if (handled) { + return; + } + } + } + + if (isTaskRoot() && DeviceUtils.getInstance().isChromebook(WPMainActivity.this)) { + return; // don't close app in Main Activity + } + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + } + private void showJetpackOverlayIfNeeded(String action) { if (!mJetpackFeatureRemovalOverlayUtil.shouldHideJetpackFeatures()) { return; @@ -1107,25 +1134,6 @@ private void announceTitleForAccessibility(PageType pageType) { getWindow().getDecorView().announceForAccessibility(mBottomNav.getContentDescriptionForPageType(pageType)); } - @Override - public void onBackPressed() { - // let the fragment handle the back button if it implements our OnParentBackPressedListener - if (mBottomNav != null) { - Fragment fragment = mBottomNav.getActiveFragment(); - if (fragment instanceof OnActivityBackPressedListener) { - boolean handled = ((OnActivityBackPressedListener) fragment).onActivityBackPressed(); - if (handled) { - return; - } - } - } - - if (isTaskRoot() && DeviceUtils.getInstance().isChromebook(this)) { - return; // don't close app in Main Activity - } - super.onBackPressed(); - } - @Override public void onRequestShowBottomNavigation() { showBottomNav(true); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationActivity.kt index 109109bac25a..f8604ff640bb 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationActivity.kt @@ -8,6 +8,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.wordpress.android.R import org.wordpress.android.databinding.ActivityJetpackMigrationBinding import org.wordpress.android.ui.utils.PreMigrationDeepLinkData +import org.wordpress.android.util.extensions.getParcelableExtraCompat @AndroidEntryPoint class JetpackMigrationActivity : AppCompatActivity() { @@ -18,7 +19,7 @@ class JetpackMigrationActivity : AppCompatActivity() { setContentView(root) if (savedInstanceState == null) { val showDeleteWpState = intent.getBooleanExtra(KEY_SHOW_DELETE_WP_STATE, false) - val deepLinkData = intent.getParcelableExtra(KEY_DEEP_LINK_DATA) + val deepLinkData = intent.getParcelableExtraCompat(KEY_DEEP_LINK_DATA) val fragment = JetpackMigrationFragment.newInstance(showDeleteWpState, deepLinkData) supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, fragment) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationFragment.kt index 607636233623..91f9e78ca712 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/jetpack/migration/JetpackMigrationFragment.kt @@ -4,7 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.compose.animation.Crossfade import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable @@ -44,6 +44,7 @@ import org.wordpress.android.ui.utils.PreMigrationDeepLinkData import org.wordpress.android.util.AppThemeUtils import org.wordpress.android.util.LocaleManager import org.wordpress.android.util.UriWrapper +import org.wordpress.android.util.extensions.getParcelableCompat import javax.inject.Inject @AndroidEntryPoint @@ -77,7 +78,7 @@ class JetpackMigrationFragment : Fragment() { observeViewModelEvents() observeRefreshAppThemeEvents() val showDeleteWpState = arguments?.getBoolean(KEY_SHOW_DELETE_WP_STATE, false) ?: false - val deepLinkData = arguments?.getParcelable(KEY_DEEP_LINK_DATA) + val deepLinkData = arguments?.getParcelableCompat(KEY_DEEP_LINK_DATA) initBackPressHandler(showDeleteWpState) viewModel.start( showDeleteWpState, @@ -127,15 +128,7 @@ class JetpackMigrationFragment : Fragment() { private fun initBackPressHandler(showDeleteWpState: Boolean) { if (showDeleteWpState) return - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback( - true - ) { - override fun handleOnBackPressed() { - viewModel.logoutAndFallbackToLogin() - } - }) + requireActivity().onBackPressedDispatcher.addCallback(this) { viewModel.logoutAndFallbackToLogin() } } companion object { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java index 80502a557e6a..8396fc0ceb84 100755 --- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java @@ -639,7 +639,7 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; case R.id.menu_new_media: // Do Nothing (handled in action view click listener) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPreviewActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPreviewActivity.java index 2cb4b8a8fe39..5f3a70a4f110 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPreviewActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPreviewActivity.java @@ -222,7 +222,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSettingsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSettingsActivity.java index 8836a8d76e66..2dec39e84ab3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSettingsActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSettingsActivity.java @@ -34,6 +34,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.DrawableRes; import androidx.annotation.IntegerRes; import androidx.annotation.NonNull; @@ -74,7 +75,6 @@ import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; import org.wordpress.android.util.ColorUtils; -import org.wordpress.android.util.extensions.ContextExtensionsKt; import org.wordpress.android.util.DateTimeUtils; import org.wordpress.android.util.DisplayUtils; import org.wordpress.android.util.EditTextUtils; @@ -86,9 +86,11 @@ import org.wordpress.android.util.SiteUtils; import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; -import org.wordpress.android.util.extensions.ViewExtensionsKt; import org.wordpress.android.util.WPMediaUtils; import org.wordpress.android.util.WPPermissionUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; +import org.wordpress.android.util.extensions.ContextExtensionsKt; +import org.wordpress.android.util.extensions.ViewExtensionsKt; import org.wordpress.android.util.image.ImageManager; import org.wordpress.android.util.image.ImageManager.RequestListener; import org.wordpress.android.util.image.ImageType; @@ -215,6 +217,15 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { setContentView(R.layout.media_settings_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + saveChanges(); + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + setSupportActionBar(findViewById(R.id.toolbar)); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -507,12 +518,6 @@ private void showProgress(boolean show) { findViewById(R.id.progress).setVisibility(show ? View.VISIBLE : View.GONE); } - @Override - public void onBackPressed() { - saveChanges(); - super.onBackPressed(); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.media_settings, menu); @@ -545,7 +550,7 @@ public boolean onPrepareOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } else if (item.getItemId() == R.id.menu_save) { saveMediaToDevice(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaItem.kt b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaItem.kt index 2987ced93581..878b9abb1b7a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaItem.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaItem.kt @@ -10,6 +10,7 @@ import org.wordpress.android.ui.mediapicker.MediaItem.IdentifierType.LOCAL_URI import org.wordpress.android.ui.mediapicker.MediaItem.IdentifierType.REMOTE_ID import org.wordpress.android.ui.mediapicker.MediaItem.IdentifierType.STOCK_MEDIA_IDENTIFIER import org.wordpress.android.util.UriWrapper +import org.wordpress.android.util.extensions.readParcelableCompat data class MediaItem( val identifier: Identifier, @@ -82,7 +83,7 @@ data class MediaItem( return when (type) { LOCAL_URI -> { LocalUri( - UriWrapper(requireNotNull(parcel.readParcelable(Uri::class.java.classLoader))), + UriWrapper(requireNotNull(parcel.readParcelableCompat(Uri::class.java.classLoader))), parcel.readInt() != 0 ) } @@ -97,7 +98,7 @@ data class MediaItem( } GIF_MEDIA_IDENTIFIER -> { GifMediaIdentifier( - UriWrapper(requireNotNull(parcel.readParcelable(Uri::class.java.classLoader))), + UriWrapper(requireNotNull(parcel.readParcelableCompat(Uri::class.java.classLoader))), parcel.readString() ) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActionModeCallback.kt b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActionModeCallback.kt index b0d467bc7972..20b76d875dcf 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActionModeCallback.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActionModeCallback.kt @@ -12,7 +12,6 @@ import androidx.lifecycle.Lifecycle.Event.ON_START import androidx.lifecycle.Lifecycle.Event.ON_STOP import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.Observer import org.wordpress.android.R import org.wordpress.android.ui.mediapicker.MediaPickerViewModel.ActionModeUiModel import org.wordpress.android.ui.utils.UiString.UiStringRes @@ -29,7 +28,7 @@ class MediaPickerActionModeCallback(private val viewModel: MediaPickerViewModel) lifecycleRegistry.handleLifecycleEvent(ON_START) val inflater = actionMode.menuInflater inflater.inflate(R.menu.photo_picker_action_mode, menu) - viewModel.uiState.observe(this, Observer { uiState -> + viewModel.uiState.observe(this) { uiState -> when (val uiModel = uiState.actionModeUiModel) { is ActionModeUiModel.Hidden -> { actionMode.finish() @@ -42,19 +41,20 @@ class MediaPickerActionModeCallback(private val viewModel: MediaPickerViewModel) if (editItemUiModel.isVisible) { editItem.isVisible = true - editItem.actionView.let { actionView -> + editItem.actionView?.let { actionView -> actionView.setOnClickListener { onActionItemClicked(actionMode, editItem) } TooltipCompat.setTooltipText(actionView, editItem.title) } - val editItemBadge = editItem.actionView.findViewById(R.id.customize_icon_count) - if (editItemUiModel.isCounterBadgeVisible) { - editItemBadge.visibility = View.VISIBLE - editItemBadge.text = editItemUiModel.counterBadgeValue.toString() - } else { - editItemBadge.visibility = View.GONE + editItem.actionView?.findViewById(R.id.customize_icon_count)?.let { editItemBadge -> + if (editItemUiModel.isCounterBadgeVisible) { + editItemBadge.visibility = View.VISIBLE + editItemBadge.text = editItemUiModel.counterBadgeValue.toString() + } else { + editItemBadge.visibility = View.GONE + } } } else { editItem.isVisible = false @@ -67,7 +67,7 @@ class MediaPickerActionModeCallback(private val viewModel: MediaPickerViewModel) } } } - }) + } return true } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActivity.kt index 5e25e003eab9..8adde6b7060a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerActivity.kt @@ -50,6 +50,8 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.MEDIA import org.wordpress.android.util.WPMediaUtils +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import java.io.File import javax.inject.Inject @@ -118,11 +120,11 @@ class MediaPickerActivity : LocaleAwareActivity(), MediaPickerListener { } if (savedInstanceState == null) { mediaPickerSetup = MediaPickerSetup.fromIntent(intent) - site = intent.getSerializableExtra(WordPress.SITE) as? SiteModel + site = intent.getSerializableExtraCompat(WordPress.SITE) localPostId = intent.getIntExtra(LOCAL_POST_ID, EMPTY_LOCAL_POST_ID) } else { mediaPickerSetup = MediaPickerSetup.fromBundle(savedInstanceState) - site = savedInstanceState.getSerializable(WordPress.SITE) as? SiteModel + site = savedInstanceState.getSerializableCompat(WordPress.SITE) localPostId = savedInstanceState.getInt(LOCAL_POST_ID, EMPTY_LOCAL_POST_ID) } var fragment = pickerFragment diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt index 949150a3d3e2..ded23422bb0a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt @@ -74,6 +74,9 @@ import org.wordpress.android.util.WPLinkMovementMethod import org.wordpress.android.util.WPMediaUtils import org.wordpress.android.util.WPPermissionUtils import org.wordpress.android.util.WPSwipeToRefreshHelper +import org.wordpress.android.util.extensions.getParcelableArrayListCompat +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -224,13 +227,13 @@ class MediaPickerFragment : Fragment(), MenuProvider { requireActivity().addMenuProvider(this, viewLifecycleOwner) val mediaPickerSetup = MediaPickerSetup.fromBundle(requireArguments()) - val site = requireArguments().getSerializable(WordPress.SITE) as? SiteModel + val site = requireArguments().getSerializableCompat(WordPress.SITE) var selectedIds: List? = null var lastTappedIcon: MediaPickerIcon? = null if (savedInstanceState != null) { lastTappedIcon = MediaPickerIcon.fromBundle(savedInstanceState) if (savedInstanceState.containsKey(KEY_SELECTED_IDS)) { - selectedIds = savedInstanceState.getParcelableArrayList(KEY_SELECTED_IDS)?.map { it } + selectedIds = savedInstanceState.getParcelableArrayListCompat(KEY_SELECTED_IDS)?.map { it } } } @@ -239,7 +242,7 @@ class MediaPickerFragment : Fragment(), MenuProvider { NUM_COLUMNS ) - savedInstanceState?.getParcelable(KEY_LIST_STATE)?.let { + savedInstanceState?.getParcelableCompat(KEY_LIST_STATE)?.let { layoutManager.onRestoreInstanceState(it) } with(MediaPickerFragmentBinding.bind(view)) { @@ -416,13 +419,13 @@ class MediaPickerFragment : Fragment(), MenuProvider { private fun initializeSearchView(actionMenuItem: MenuItem) { var isExpanding = false actionMenuItem.setOnActionExpandListener(object : OnActionExpandListener { - override fun onMenuItemActionExpand(item: MenuItem?): Boolean { + override fun onMenuItemActionExpand(item: MenuItem): Boolean { viewModel.onSearchExpanded() isExpanding = true return true } - override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { + override fun onMenuItemActionCollapse(item: MenuItem): Boolean { viewModel.onSearchCollapsed() return true } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt index 9f50ca206e34..386accb55434 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt @@ -100,7 +100,7 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), toolbarMain.let { toolbar -> toolbar.inflateMenu(R.menu.my_site_menu) toolbar.menu.findItem(R.id.me_item)?.let { meMenu -> - meMenu.actionView.let { actionView -> + meMenu.actionView?.let { actionView -> actionView.contentDescription = meMenu.title actionView.setOnClickListener { viewModel.onAvatarPressed() } TooltipCompat.setTooltipText(actionView, meMenu.title) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksribbon/QuickLinkRibbonViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksribbon/QuickLinkRibbonViewHolder.kt index 0bd36bd70177..2f899c5a1260 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksribbon/QuickLinkRibbonViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksribbon/QuickLinkRibbonViewHolder.kt @@ -66,14 +66,14 @@ class QuickLinkRibbonViewHolder( * We need to do this immediately, because if we don't, then the next move event could potentially * trigger the viewPager to switch tabs */ - override fun onDown(e: MotionEvent?): Boolean = with(binding) { + override fun onDown(e: MotionEvent): Boolean = with(binding) { quickLinkRibbonItemList.parent.requestDisallowInterceptTouchEvent(true) return super.onDown(e) } override fun onScroll( - e1: MotionEvent?, - e2: MotionEvent?, + e1: MotionEvent, + e2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean = with(binding) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/dynamiccards/quickstart/QuickStartDynamicCardViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/dynamiccards/quickstart/QuickStartDynamicCardViewHolder.kt index 8be75b0c0ba0..c78f9b01b5c5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/dynamiccards/quickstart/QuickStartDynamicCardViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/dynamiccards/quickstart/QuickStartDynamicCardViewHolder.kt @@ -22,6 +22,7 @@ import org.wordpress.android.ui.mysite.MySiteCardAndItem.DynamicCard.QuickStartD import org.wordpress.android.ui.mysite.MySiteCardAndItemViewHolder import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.ColorUtils +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.extensions.viewBinding private const val Y_BUFFER = 10 @@ -90,7 +91,7 @@ class QuickStartDynamicCardViewHolder( private fun restoreScrollState(recyclerView: RecyclerView, key: String) { recyclerView.layoutManager?.apply { - val scrollState = nestedScrollStates.getParcelable(key) + val scrollState = nestedScrollStates.getParcelableCompat(key) if (scrollState != null) { onRestoreInstanceState(scrollState) } else { @@ -127,14 +128,14 @@ class QuickStartDynamicCardViewHolder( * We need to do this immediately, because if we don't, then the next move event could potentially * trigger the viewPager to switch tabs */ - override fun onDown(e: MotionEvent?): Boolean = with(binding) { + override fun onDown(e: MotionEvent): Boolean = with(binding) { quickStartCardRecyclerView.parent.requestDisallowInterceptTouchEvent(true) return super.onDown(e) } override fun onScroll( - e1: MotionEvent?, - e2: MotionEvent?, + e1: MotionEvent, + e2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean = with(binding) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/jetpackbadge/JetpackPoweredBottomSheetFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/jetpackbadge/JetpackPoweredBottomSheetFragment.kt index 6945317669b4..40e52ccb47b2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/jetpackbadge/JetpackPoweredBottomSheetFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/jetpackbadge/JetpackPoweredBottomSheetFragment.kt @@ -14,8 +14,6 @@ import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import dagger.hilt.android.AndroidEntryPoint import org.wordpress.android.R -import org.wordpress.android.R.raw -import org.wordpress.android.R.string import org.wordpress.android.databinding.JetpackPoweredBottomSheetBinding import org.wordpress.android.databinding.JetpackPoweredExpandedBottomSheetBinding import org.wordpress.android.ui.ActivityLauncherWrapper @@ -27,6 +25,7 @@ import org.wordpress.android.ui.main.WPMainNavigationView.PageType.READER import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredDialogAction.DismissDialog import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredDialogAction.OpenPlayStore import org.wordpress.android.util.extensions.exhaustive +import org.wordpress.android.util.extensions.getSerializableCompat import javax.inject.Inject @AndroidEntryPoint @@ -85,27 +84,27 @@ class JetpackPoweredBottomSheetFragment : BottomSheetDialogFragment() { private fun setupFullScreenViews(view: View) { with(JetpackPoweredExpandedBottomSheetBinding.bind(view)) { - when (arguments?.getSerializable(KEY_SITE_SCREEN) as? PageType ?: MY_SITE) { + when (arguments?.getSerializableCompat(KEY_SITE_SCREEN) ?: MY_SITE) { MY_SITE -> { - val animRes = if (rtlLayout(view)) raw.jp_stats_rtl else raw.jp_stats_left + val animRes = if (rtlLayout(view)) R.raw.jp_stats_rtl else R.raw.jp_stats_left illustrationView.setAnimation(animRes) - title.text = getString(string.wp_jetpack_powered_stats_powered_by_jetpack) - caption.text = getString(string.wp_jetpack_powered_stats_powered_by_jetpack_caption) - secondaryButton.text = getString(string.wp_jetpack_continue_to_stats) + title.text = getString(R.string.wp_jetpack_powered_stats_powered_by_jetpack) + caption.text = getString(R.string.wp_jetpack_powered_stats_powered_by_jetpack_caption) + secondaryButton.text = getString(R.string.wp_jetpack_continue_to_stats) } READER -> { - val animRes = if (rtlLayout(view)) raw.jp_reader_rtl else raw.jp_reader_left + val animRes = if (rtlLayout(view)) R.raw.jp_reader_rtl else R.raw.jp_reader_left illustrationView.setAnimation(animRes) - title.text = getString(string.wp_jetpack_powered_reader_powered_by_jetpack) - caption.text = getString(string.wp_jetpack_powered_reader_powered_by_jetpack_caption) - secondaryButton.text = getString(string.wp_jetpack_continue_to_reader) + title.text = getString(R.string.wp_jetpack_powered_reader_powered_by_jetpack) + caption.text = getString(R.string.wp_jetpack_powered_reader_powered_by_jetpack_caption) + secondaryButton.text = getString(R.string.wp_jetpack_continue_to_reader) } NOTIFS -> { - val animRes = if (rtlLayout(view)) raw.jp_notifications_rtl else raw.jp_notifications_left + val animRes = if (rtlLayout(view)) R.raw.jp_notifications_rtl else R.raw.jp_notifications_left illustrationView.setAnimation(animRes) - title.text = getString(string.wp_jetpack_powered_notifications_powered_by_jetpack) - caption.text = getString(string.wp_jetpack_powered_notifications_powered_by_jetpack_caption) - secondaryButton.text = getString(string.wp_jetpack_continue_to_notifications) + title.text = getString(R.string.wp_jetpack_powered_notifications_powered_by_jetpack) + caption.text = getString(R.string.wp_jetpack_powered_notifications_powered_by_jetpack_caption) + secondaryButton.text = getString(R.string.wp_jetpack_continue_to_notifications) } } primaryButton.setOnClickListener { viewModel.openJetpackAppDownloadLink() } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt index e2aaec738564..a4ce6db915b5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/tabs/MySiteTabFragment.kt @@ -87,6 +87,7 @@ import org.wordpress.android.util.SnackbarSequencer import org.wordpress.android.util.UriWrapper import org.wordpress.android.util.WPSwipeToRefreshHelper.buildSwipeToRefreshHelper import org.wordpress.android.util.extensions.getColorFromAttribute +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.extensions.setVisible import org.wordpress.android.util.helpers.SwipeToRefreshHelper import org.wordpress.android.util.image.ImageManager @@ -737,7 +738,7 @@ class MySiteTabFragment : Fragment(R.layout.my_site_tab_fragment), } override fun onConfirm(result: Bundle?) { - val task = result?.getSerializable(QuickStartFullScreenDialogFragment.RESULT_TASK) as? QuickStartTask + val task = result?.getSerializableCompat(QuickStartFullScreenDialogFragment.RESULT_TASK) as? QuickStartTask task?.let { viewModel.onQuickStartTaskCardClick(it) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/DismissNotificationReceiver.kt b/WordPress/src/main/java/org/wordpress/android/ui/notifications/DismissNotificationReceiver.kt index 88d6f30af644..2a1125c4fabc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/DismissNotificationReceiver.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/DismissNotificationReceiver.kt @@ -7,6 +7,7 @@ import androidx.core.app.NotificationManagerCompat import org.wordpress.android.WordPress import org.wordpress.android.analytics.AnalyticsTracker.Stat import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject class DismissNotificationReceiver : BroadcastReceiver() { @@ -21,7 +22,7 @@ class DismissNotificationReceiver : BroadcastReceiver() { } private fun trackAnalyticsEvent(intent: Intent) { - val stat = intent.getSerializableExtra(EXTRA_STAT_TO_TRACK) as Stat? + val stat = intent.getSerializableExtraCompat(EXTRA_STAT_TO_TRACK) if (stat != null) { analyticsTrackerWrapper.track(stat) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailActivity.java index 5d305470d934..faee35b34051 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailActivity.java @@ -9,6 +9,7 @@ import android.view.WindowManager; import android.widget.ProgressBar; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; @@ -57,13 +58,14 @@ import org.wordpress.android.ui.reader.comments.ThreadedCommentsActionSource; import org.wordpress.android.ui.reader.tracker.ReaderTracker; import org.wordpress.android.ui.stats.StatsViewType; -import org.wordpress.android.util.extensions.AppBarLayoutExtensionsKt; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; import org.wordpress.android.util.analytics.AnalyticsUtils.AnalyticsCommentActionSource; import org.wordpress.android.util.config.LikesEnhancementsFeatureConfig; +import org.wordpress.android.util.extensions.AppBarLayoutExtensionsKt; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.widgets.WPSwipeSnackbar; import org.wordpress.android.widgets.WPViewPager; import org.wordpress.android.widgets.WPViewPagerTransformer; @@ -74,14 +76,14 @@ import javax.inject.Inject; -import dagger.hilt.android.AndroidEntryPoint; - import static org.wordpress.android.models.Note.NOTE_COMMENT_LIKE_TYPE; import static org.wordpress.android.models.Note.NOTE_COMMENT_TYPE; import static org.wordpress.android.models.Note.NOTE_FOLLOW_TYPE; import static org.wordpress.android.models.Note.NOTE_LIKE_TYPE; import static org.wordpress.android.ui.notifications.services.NotificationsUpdateServiceStarter.IS_TAPPED_ON_NOTIFICATION; +import dagger.hilt.android.AndroidEntryPoint; + @AndroidEntryPoint public class NotificationsDetailActivity extends LocaleAwareActivity implements CommentActions.OnNoteCommentActionListener, @@ -105,18 +107,6 @@ public class NotificationsDetailActivity extends LocaleAwareActivity implements private AppBarLayout mAppBarLayout; private Toolbar mToolbar; - @Override - public void onBackPressed() { - CollapseFullScreenDialogFragment fragment = (CollapseFullScreenDialogFragment) - getSupportFragmentManager().findFragmentByTag(CollapseFullScreenDialogFragment.TAG); - - if (fragment != null) { - fragment.onBackPressed(); - } else { - super.onBackPressed(); - } - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -125,6 +115,21 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.notifications_detail_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + CollapseFullScreenDialogFragment fragment = (CollapseFullScreenDialogFragment) + getSupportFragmentManager().findFragmentByTag(CollapseFullScreenDialogFragment.TAG); + + if (fragment != null) { + fragment.collapse(); + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + mToolbar = findViewById(R.id.toolbar_main); setSupportActionBar(mToolbar); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt index 98709e268b61..3f1c488ce4b7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt @@ -17,6 +17,8 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.QuickStartUtilsWrapper import org.wordpress.android.util.SnackbarSequencer +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.pages.PageListViewModel import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType @@ -88,11 +90,13 @@ class PageListFragment : ViewPagerFragment(R.layout.pages_list_fragment) { } private fun PagesListFragmentBinding.initializeViewModels(activity: FragmentActivity) { - val pagesViewModel = ViewModelProvider(activity, viewModelFactory).get(PagesViewModel::class.java) + val pagesViewModel = ViewModelProvider(activity, viewModelFactory)[PagesViewModel::class.java] - val listType = arguments?.getSerializable(typeKey) as PageListType - viewModel = ViewModelProvider(this@PageListFragment, viewModelFactory) - .get(listType.name, PageListViewModel::class.java) + val listType = requireNotNull(arguments?.getSerializableCompat(typeKey)) + viewModel = ViewModelProvider( + this@PageListFragment, + viewModelFactory + )[listType.name, PageListViewModel::class.java] viewModel.start(listType, pagesViewModel) @@ -101,7 +105,7 @@ class PageListFragment : ViewPagerFragment(R.layout.pages_list_fragment) { private fun PagesListFragmentBinding.initializeViews(savedInstanceState: Bundle?) { val layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false) - savedInstanceState?.getParcelable(listStateKey)?.let { + savedInstanceState?.getParcelableCompat(listStateKey)?.let { layoutManager.onRestoreInstanceState(it) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentFragment.kt index cdeb85212eab..02628c31f887 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentFragment.kt @@ -25,6 +25,8 @@ import org.wordpress.android.WordPress import org.wordpress.android.databinding.PageParentFragmentBinding import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.util.DisplayUtils +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.viewmodel.pages.PageParentViewModel import org.wordpress.android.widgets.RecyclerItemDecoration import javax.inject.Inject @@ -60,7 +62,7 @@ class PageParentFragment : Fragment(R.layout.page_parent_fragment), MenuProvider override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) { android.R.id.home -> { - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() true } R.id.save_parent -> { @@ -87,17 +89,17 @@ class PageParentFragment : Fragment(R.layout.page_parent_fragment), MenuProvider result.putExtra(EXTRA_PAGE_REMOTE_ID_KEY, pageId) result.putExtra(EXTRA_PAGE_PARENT_ID_KEY, viewModel.currentParent.id) activity?.setResult(Activity.RESULT_OK, result) - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() } private fun PageParentFragmentBinding.initializeSearchView() { searchAction.setOnActionExpandListener(object : OnActionExpandListener { - override fun onMenuItemActionExpand(item: MenuItem?): Boolean { + override fun onMenuItemActionExpand(item: MenuItem): Boolean { viewModel.onSearchExpanded(restorePreviousSearch) return true } - override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { + override fun onMenuItemActionCollapse(item: MenuItem): Boolean { viewModel.onSearchCollapsed() return true } @@ -121,8 +123,8 @@ class PageParentFragment : Fragment(R.layout.page_parent_fragment), MenuProvider } }) - val searchEditFrame = searchAction.actionView.findViewById(R.id.search_edit_frame) - (searchEditFrame.layoutParams as LinearLayout.LayoutParams) + val searchEditFrame = searchAction.actionView?.findViewById(R.id.search_edit_frame) + (searchEditFrame?.layoutParams as LinearLayout.LayoutParams) .apply { this.leftMargin = DisplayUtils.dpToPx(activity, SEARCH_ACTION_LEFT_MARGIN_DP) } viewModel.isSearchExpanded.observe(this@PageParentFragment) { @@ -158,7 +160,7 @@ class PageParentFragment : Fragment(R.layout.page_parent_fragment), MenuProvider private fun PageParentFragmentBinding.initializeViews(activity: FragmentActivity, savedInstanceState: Bundle?) { val layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false) - savedInstanceState?.getParcelable(listStateKey)?.let { + savedInstanceState?.getParcelableCompat(listStateKey)?.let { layoutManager.onRestoreInstanceState(it) } @@ -178,15 +180,13 @@ class PageParentFragment : Fragment(R.layout.page_parent_fragment), MenuProvider pageId: Long, isFirstStart: Boolean ) { - viewModel = ViewModelProvider(activity, viewModelFactory) - .get(PageParentViewModel::class.java) + viewModel = ViewModelProvider(activity, viewModelFactory)[PageParentViewModel::class.java] setupObservers() if (isFirstStart) { - val site = activity.intent?.getSerializableExtra(WordPress.SITE) as SiteModel? - val nonNullSite = checkNotNull(site) - viewModel.start(nonNullSite, pageId) + val site = requireNotNull(activity.intent?.getSerializableExtraCompat(WordPress.SITE)) + viewModel.start(site, pageId) } else { restorePreviousSearch = true } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentSearchFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentSearchFragment.kt index 6dd9857a8ee6..43fad8ba2caa 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentSearchFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageParentSearchFragment.kt @@ -16,6 +16,7 @@ import org.wordpress.android.R import org.wordpress.android.WordPress import org.wordpress.android.databinding.PagesListFragmentBinding import org.wordpress.android.util.DisplayUtils +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.viewmodel.pages.PageParentSearchViewModel import org.wordpress.android.viewmodel.pages.PageParentViewModel import org.wordpress.android.widgets.RecyclerItemDecoration @@ -71,7 +72,7 @@ class PageParentSearchFragment : Fragment(R.layout.pages_list_fragment), Corouti private fun PagesListFragmentBinding.initializeViews(savedInstanceState: Bundle?) { val layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false) - savedInstanceState?.getParcelable(listStateKey)?.let { + savedInstanceState?.getParcelableCompat(listStateKey)?.let { layoutManager.onRestoreInstanceState(it) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesActivity.kt index 70caf8d0bbb8..f7a52adb5ece 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesActivity.kt @@ -12,6 +12,7 @@ import org.wordpress.android.ui.LocaleAwareActivity import org.wordpress.android.ui.notifications.SystemNotificationsTracker import org.wordpress.android.ui.posts.BasicFragmentDialog.BasicDialogNegativeClickInterface import org.wordpress.android.ui.posts.BasicFragmentDialog.BasicDialogPositiveClickInterface +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject const val EXTRA_PAGE_REMOTE_ID_KEY = "extra_page_remote_id_key" @@ -39,8 +40,9 @@ class PagesActivity : LocaleAwareActivity(), private fun handleIntent(intent: Intent) { if (intent.hasExtra(ARG_NOTIFICATION_TYPE)) { - val notificationType: NotificationType = - intent.getSerializableExtra(ARG_NOTIFICATION_TYPE) as NotificationType + val notificationType = requireNotNull( + intent.getSerializableExtraCompat(ARG_NOTIFICATION_TYPE) + ) systemNotificationTracker.trackTappedNotification(notificationType) } @@ -54,7 +56,7 @@ class PagesActivity : LocaleAwareActivity(), override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt index 017f7b4b732e..adfcd63c6e6b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt @@ -56,6 +56,8 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.ToastUtils.Duration import org.wordpress.android.util.WPSwipeToRefreshHelper +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.extensions.redirectContextClickToLongPressListener import org.wordpress.android.util.extensions.setLiftOnScrollTargetViewIdAndRequestLayout import org.wordpress.android.util.helpers.SwipeToRefreshHelper @@ -265,12 +267,12 @@ class PagesFragment : Fragment(R.layout.pages_fragment), ScrollableViewInitializ private fun PagesFragmentBinding.initializeSearchView() { actionMenuItem.setOnActionExpandListener(object : OnActionExpandListener { - override fun onMenuItemActionExpand(item: MenuItem?): Boolean { + override fun onMenuItemActionExpand(item: MenuItem): Boolean { viewModel.onSearchExpanded(restorePreviousSearch) return true } - override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { + override fun onMenuItemActionCollapse(item: MenuItem): Boolean { viewModel.onSearchCollapsed() return true } @@ -295,17 +297,17 @@ class PagesFragment : Fragment(R.layout.pages_fragment), ScrollableViewInitializ }) // fix the search view margins to match the action bar - val searchEditFrame = actionMenuItem.actionView.findViewById(R.id.search_edit_frame) - (searchEditFrame.layoutParams as LinearLayout.LayoutParams) + val searchEditFrame = actionMenuItem.actionView?.findViewById(R.id.search_edit_frame) + (searchEditFrame?.layoutParams as LinearLayout.LayoutParams) .apply { this.leftMargin = DisplayUtils.dpToPx(activity, -8) } - viewModel.isSearchExpanded.observe(this@PagesFragment, Observer { + viewModel.isSearchExpanded.observe(this@PagesFragment) { if (it == true) { showSearchList(actionMenuItem) } else { hideSearchList(actionMenuItem) } - }) + } } private fun PagesFragmentBinding.initializeViewModelObservers( @@ -316,13 +318,15 @@ class PagesFragment : Fragment(R.layout.pages_fragment), ScrollableViewInitializ setupActions(activity) setupMlpObservers(activity) - val site = if (savedInstanceState == null) { - val nonNullIntent = checkNotNull(activity.intent) - nonNullIntent.getSerializableExtra(WordPress.SITE) as SiteModel - } else { - restorePreviousSearch = true - savedInstanceState.getSerializable(WordPress.SITE) as SiteModel - } + val site = requireNotNull( + if (savedInstanceState == null) { + val nonNullIntent = checkNotNull(activity.intent) + nonNullIntent.getSerializableExtraCompat(WordPress.SITE) + } else { + restorePreviousSearch = true + savedInstanceState.getSerializableCompat(WordPress.SITE) + } + ) viewModel.authorUIState.observe(activity, Observer { state -> state?.let { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt index d5ce0ee83b76..a22325336b8f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt @@ -14,6 +14,7 @@ import org.wordpress.android.WordPress import org.wordpress.android.databinding.PagesListFragmentBinding import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.DisplayUtils +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.viewmodel.pages.PagesViewModel import org.wordpress.android.viewmodel.pages.SearchListViewModel import org.wordpress.android.widgets.RecyclerItemDecoration @@ -66,7 +67,7 @@ class SearchListFragment : Fragment(R.layout.pages_list_fragment) { private fun PagesListFragmentBinding.initializeViews(savedInstanceState: Bundle?) { val layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false) - savedInstanceState?.getParcelable(listStateKey)?.let { + savedInstanceState?.getParcelableCompat(listStateKey)?.let { layoutManager.onRestoreInstanceState(it) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleInviteDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleInviteDialogFragment.kt index c286635c31ba..1c55fbda758f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleInviteDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleInviteDialogFragment.kt @@ -11,6 +11,7 @@ import org.wordpress.android.R import org.wordpress.android.WordPress import org.wordpress.android.ui.people.PeopleInviteDialogFragment.DialogMode.DISABLE_INVITE_LINKS_CONFIRMATION import org.wordpress.android.ui.people.PeopleInviteDialogFragment.DialogMode.INVITE_LINKS_ROLE_SELECTION +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.ContextProvider import javax.inject.Inject @@ -42,10 +43,11 @@ class PeopleInviteDialogFragment : DialogFragment() { @Suppress("DEPRECATION") override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { viewModel = ViewModelProvider( - targetFragment as ViewModelStoreOwner, viewModelFactory - ).get(PeopleInviteViewModel::class.java) + targetFragment as ViewModelStoreOwner, + viewModelFactory + )[PeopleInviteViewModel::class.java] - val dialogMode = arguments?.getSerializable(ARG_DIALOG_MODE) as? DialogMode + val dialogMode = arguments?.getSerializableCompat(ARG_DIALOG_MODE) val roles = arguments?.getStringArray(ARG_ROLES) val builder = MaterialAlertDialogBuilder(requireActivity()) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java index 0f0f8c69a615..4d2214c3a7ca 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/PeopleManagementActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.view.MenuItem; +import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; @@ -32,6 +33,7 @@ import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import java.util.List; @@ -100,6 +102,16 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.people_management_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (!navigateBackToPeopleListFragment()) { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + if (savedInstanceState == null) { mSite = (SiteModel) getIntent().getSerializableExtra(WordPress.SITE); } else { @@ -217,17 +229,10 @@ public void onStop() { super.onStop(); } - @Override - public void onBackPressed() { - if (!navigateBackToPeopleListFragment()) { - super.onBackPressed(); - } - } - @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } else if (item.getItemId() == R.id.remove_person) { confirmRemovePerson(); @@ -239,7 +244,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { if (peopleInviteFragment == null) { peopleInviteFragment = PeopleInviteFragment.newInstance(mSite); } - if (peopleInviteFragment != null && !peopleInviteFragment.isAdded()) { + if (!peopleInviteFragment.isAdded()) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, peopleInviteFragment, KEY_PEOPLE_INVITE_FRAGMENT); fragmentTransaction.addToBackStack(null); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/WPEditTextWithChipsOutlined.kt b/WordPress/src/main/java/org/wordpress/android/ui/people/WPEditTextWithChipsOutlined.kt index f6244b156306..b7f05a833746 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/WPEditTextWithChipsOutlined.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/WPEditTextWithChipsOutlined.kt @@ -551,18 +551,18 @@ class WPEditTextWithChipsOutlined @JvmOverloads constructor( .scaleY(1f) .setDuration(LABEL_ANIMATION_DURATION) .setListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { label.visibility = View.INVISIBLE hint.visibility = View.VISIBLE } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { } - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } }).start() } @@ -581,21 +581,21 @@ class WPEditTextWithChipsOutlined @JvmOverloads constructor( .scaleY(label.height.toFloat() / hint.height) .setDuration(LABEL_ANIMATION_DURATION) .setListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { setLabelColor(label, colorSurface, outlineColorAlphaFocused) label.visibility = View.VISIBLE hint.visibility = View.VISIBLE } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { hint.visibility = View.INVISIBLE setLabelColor(label, outlineColorFocused, outlineColorAlphaFocused) } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { } - override fun onAnimationRepeat(animation: Animator?) { + override fun onAnimationRepeat(animation: Animator) { } }).start() } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/photopicker/PhotoPickerFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/photopicker/PhotoPickerFragment.kt index 3ad1acb4abae..a49ea878679d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/photopicker/PhotoPickerFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/photopicker/PhotoPickerFragment.kt @@ -35,6 +35,8 @@ import org.wordpress.android.util.UriWrapper import org.wordpress.android.util.ViewWrapper import org.wordpress.android.util.WPMediaUtils import org.wordpress.android.util.WPPermissionUtils +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -90,8 +92,10 @@ class PhotoPickerFragment : Fragment(R.layout.photo_picker_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val browserType = requireArguments().getSerializable(MediaBrowserActivity.ARG_BROWSER_TYPE) as MediaBrowserType - val site = requireArguments().getSerializable(WordPress.SITE) as? SiteModel + val browserType = requireNotNull( + arguments?.getSerializableCompat(MediaBrowserActivity.ARG_BROWSER_TYPE) + ) + val site = requireArguments().getSerializableCompat(WordPress.SITE) var selectedIds: List? = null var lastTappedIcon: PhotoPickerIcon? = null if (savedInstanceState != null) { @@ -111,7 +115,7 @@ class PhotoPickerFragment : Fragment(R.layout.photo_picker_fragment) { NUM_COLUMNS ) - savedInstanceState?.getParcelable(KEY_LIST_STATE)?.let { + savedInstanceState?.getParcelableCompat(KEY_LIST_STATE)?.let { layoutManager.onRestoreInstanceState(it) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/plans/PlanDetailsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/plans/PlanDetailsFragment.kt index 7de5b92db14a..23a6411ad2f8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/plans/PlanDetailsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/plans/PlanDetailsFragment.kt @@ -14,6 +14,7 @@ import org.wordpress.android.fluxc.model.plans.PlanOffersModel import org.wordpress.android.ui.FullScreenDialogFragment.FullScreenDialogContent import org.wordpress.android.ui.FullScreenDialogFragment.FullScreenDialogController import org.wordpress.android.util.StringUtils +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.image.ImageType import javax.inject.Inject @@ -42,9 +43,9 @@ class PlanDetailsFragment : Fragment(), FullScreenDialogContent { (requireActivity().application as WordPress).component().inject(this) plan = if (savedInstanceState != null) { - savedInstanceState.getParcelable(KEY_PLAN) + savedInstanceState.getParcelableCompat(KEY_PLAN) } else { - arguments?.getParcelable(EXTRA_PLAN) + arguments?.getParcelableCompat(EXTRA_PLAN) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginBrowserActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginBrowserActivity.java index 75d16600eefa..9100438a7a41 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginBrowserActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginBrowserActivity.java @@ -11,6 +11,7 @@ import android.widget.RatingBar; import android.widget.TextView; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; @@ -40,13 +41,14 @@ import org.wordpress.android.ui.LocaleAwareActivity; import org.wordpress.android.util.ActivityUtils; import org.wordpress.android.util.AniUtils; -import org.wordpress.android.util.extensions.AppBarLayoutExtensionsKt; import org.wordpress.android.util.ColorUtils; -import org.wordpress.android.util.extensions.ContextExtensionsKt; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; +import org.wordpress.android.util.extensions.AppBarLayoutExtensionsKt; +import org.wordpress.android.util.extensions.CompatExtensionsKt; +import org.wordpress.android.util.extensions.ContextExtensionsKt; import org.wordpress.android.util.image.ImageManager; import org.wordpress.android.util.image.ImageType; import org.wordpress.android.viewmodel.plugins.PluginBrowserViewModel; @@ -80,6 +82,18 @@ public void onCreate(Bundle savedInstanceState) { ((WordPress) getApplication()).component().inject(this); setContentView(R.layout.plugin_browser_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + // update the lift on scroll target id when we return to the root fragment + AppBarLayoutExtensionsKt.setLiftOnScrollTargetViewIdAndRequestLayout(mAppBar, R.id.scroll_view); + } + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + mViewModel = new ViewModelProvider(this, mViewModelFactory).get(PluginBrowserViewModel.class); mSitePluginsRecycler = findViewById(R.id.installed_plugins_recycler); @@ -225,21 +239,12 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); } - @Override - public void onBackPressed() { - if (getSupportFragmentManager().getBackStackEntryCount() > 0) { - // update the lift on scroll target id when we return to the root fragment - AppBarLayoutExtensionsKt.setLiftOnScrollTargetViewIdAndRequestLayout(mAppBar, R.id.scroll_view); - } - super.onBackPressed(); - } - private void reloadPluginAdapterAndVisibility(@NonNull PluginListType pluginType, @Nullable ListState listState) { if (listState == null) { @@ -315,7 +320,7 @@ private void showListFragment(@NonNull PluginListType listType) { private void hideListFragment() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginDetailActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginDetailActivity.java index f218343e1467..e9ca8483951d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginDetailActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginDetailActivity.java @@ -80,7 +80,6 @@ import org.wordpress.android.util.AniUtils; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; -import org.wordpress.android.util.extensions.ContextExtensionsKt; import org.wordpress.android.util.DateTimeUtils; import org.wordpress.android.util.DisplayUtils; import org.wordpress.android.util.FormatUtils; @@ -91,6 +90,7 @@ import org.wordpress.android.util.ToastUtils.Duration; import org.wordpress.android.util.WPLinkMovementMethod; import org.wordpress.android.util.analytics.AnalyticsUtils; +import org.wordpress.android.util.extensions.ContextExtensionsKt; import org.wordpress.android.util.image.ImageManager; import org.wordpress.android.util.image.ImageType; import org.wordpress.android.widgets.WPSnackbar; @@ -413,7 +413,7 @@ public boolean onOptionsItemSelected(final MenuItem item) { // user is leaving the page dispatchConfigurePluginAction(true); } - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } else if (item.getItemId() == R.id.menu_trash) { if (NetworkUtils.checkConnection(this)) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/BasicDialog.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/BasicDialog.kt index 671faa0af244..88f658045a55 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/BasicDialog.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/BasicDialog.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.android.support.AndroidSupportInjection import org.wordpress.android.ui.posts.BasicDialogViewModel.BasicDialogModel +import org.wordpress.android.util.extensions.getParcelableCompat import javax.inject.Inject /** @@ -34,7 +35,7 @@ class BasicDialog : AppCompatDialogFragment() { setStyle(STYLE_NORMAL, theme) if (savedInstanceState != null) { - model = requireNotNull(savedInstanceState.getParcelable(STATE_KEY_MODEL)) + model = requireNotNull(savedInstanceState.getParcelableCompat(STATE_KEY_MODEL)) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java index ef2fc12e20db..a30f7d5b0d13 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java @@ -18,6 +18,7 @@ import android.webkit.MimeTypeMap; import android.widget.Toast; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; @@ -524,6 +525,15 @@ private void createPostEditorAnalyticsSessionTracker(boolean showGutenbergEditor protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((WordPress) getApplication()).component().inject(this); + + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + handleBackPressed(); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + mDispatcher.register(this); mViewModel = new ViewModelProvider(this, mViewModelFactory).get(StorePostViewModel.class); mStorageUtilsViewModel = new ViewModelProvider(this, mViewModelFactory).get(StorageUtilsViewModel.class); @@ -1968,11 +1978,6 @@ public interface OnPostUpdatedFromUIListener { void onPostUpdatedFromUI(@Nullable UpdatePostResult updatePostResult); } - @Override - public void onBackPressed() { - handleBackPressed(); - } - @Override public void onHistoryItemClicked(@NonNull Revision revision, @NonNull List revisions) { AnalyticsTracker.track(Stat.REVISIONS_DETAIL_VIEWED_FROM_LIST); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/HistoryListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/HistoryListFragment.kt index f406562bf047..ba5fb62aabb4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/HistoryListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/HistoryListFragment.kt @@ -17,6 +17,7 @@ import org.wordpress.android.ui.history.HistoryAdapter import org.wordpress.android.ui.history.HistoryListItem import org.wordpress.android.ui.history.HistoryListItem.Revision import org.wordpress.android.util.WPSwipeToRefreshHelper +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.helpers.SwipeToRefreshHelper import org.wordpress.android.viewmodel.history.HistoryViewModel import org.wordpress.android.viewmodel.history.HistoryViewModel.HistoryListStatus @@ -84,10 +85,11 @@ class HistoryListFragment : Fragment(R.layout.history_list_fragment) { (nonNullActivity.application as WordPress).component().inject(this@HistoryListFragment) - viewModel = ViewModelProvider(this@HistoryListFragment, viewModelFactory).get(HistoryViewModel::class.java) + viewModel = ViewModelProvider(this@HistoryListFragment, viewModelFactory)[HistoryViewModel::class.java] + val site = requireNotNull(arguments?.getSerializableCompat(KEY_SITE)) viewModel.create( localPostId = arguments?.getInt(KEY_POST_LOCAL_ID) ?: 0, - site = arguments?.get(KEY_SITE) as SiteModel + site = site ) updatePostOrPageEmptyView() setObservers() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/JetpackSecuritySettingsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/JetpackSecuritySettingsActivity.kt index e9d911010b89..2816b22a829d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/JetpackSecuritySettingsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/JetpackSecuritySettingsActivity.kt @@ -2,6 +2,7 @@ package org.wordpress.android.ui.posts import android.os.Bundle import android.view.MenuItem +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import org.wordpress.android.R.string import org.wordpress.android.databinding.FragmentJetpackSecuritySettingsBinding @@ -13,6 +14,11 @@ class JetpackSecuritySettingsActivity : AppCompatActivity() { setContentView(root) setupToolbar() } + + onBackPressedDispatcher.addCallback(this) { + setResult(RESULT_OK, null) + finish() + } } private fun FragmentJetpackSecuritySettingsBinding.setupToolbar() { @@ -35,11 +41,6 @@ class JetpackSecuritySettingsActivity : AppCompatActivity() { return super.onOptionsItemSelected(item) } - override fun onBackPressed() { - setResult(RESULT_OK, null) - finish() - } - companion object { const val JETPACK_SECURITY_SETTINGS_REQUEST_CODE = 101 } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostDatePickerDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostDatePickerDialogFragment.kt index 6ccc4df769ac..c40d280a8cc1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostDatePickerDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostDatePickerDialogFragment.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.ViewModelProvider import org.wordpress.android.R import org.wordpress.android.WordPress import org.wordpress.android.ui.posts.prepublishing.PrepublishingPublishSettingsViewModel +import org.wordpress.android.util.extensions.getParcelableCompat import javax.inject.Inject class PostDatePickerDialogFragment : DialogFragment() { @@ -18,15 +19,19 @@ class PostDatePickerDialogFragment : DialogFragment() { private lateinit var viewModel: PublishSettingsViewModel override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val publishSettingsFragmentType = arguments?.getParcelable( + val publishSettingsFragmentType = arguments?.getParcelableCompat( ARG_PUBLISH_SETTINGS_FRAGMENT_TYPE ) viewModel = when (publishSettingsFragmentType) { - PublishSettingsFragmentType.EDIT_POST -> ViewModelProvider(requireActivity(), viewModelFactory) - .get(EditPostPublishSettingsViewModel::class.java) - PublishSettingsFragmentType.PREPUBLISHING_NUDGES -> ViewModelProvider(requireActivity(), viewModelFactory) - .get(PrepublishingPublishSettingsViewModel::class.java) + PublishSettingsFragmentType.EDIT_POST -> ViewModelProvider( + requireActivity(), + viewModelFactory + )[EditPostPublishSettingsViewModel::class.java] + PublishSettingsFragmentType.PREPUBLISHING_NUDGES -> ViewModelProvider( + requireActivity(), + viewModelFactory + )[PrepublishingPublishSettingsViewModel::class.java] null -> error("PublishSettingsViewModel not initialized") } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListFragment.kt index 7d88c9d37027..619c6f24ba92 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListFragment.kt @@ -27,6 +27,8 @@ import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.NetworkUtils import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.WPSwipeToRefreshHelper.buildSwipeToRefreshHelper +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.helpers.SwipeToRefreshHelper import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout @@ -80,7 +82,7 @@ class PostListFragment : ViewPagerFragment() { (nonNullActivity.application as WordPress).component().inject(this) val nonNullIntent = checkNotNull(nonNullActivity.intent) - val site: SiteModel? = nonNullIntent.getSerializableExtra(WordPress.SITE) as SiteModel? + val site = nonNullIntent.getSerializableExtraCompat(WordPress.SITE) if (site == null) { ToastUtils.showToast(nonNullActivity, R.string.blog_not_found, ToastUtils.Duration.SHORT) @@ -97,14 +99,13 @@ class PostListFragment : ViewPagerFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - postListType = requireNotNull(arguments).getSerializable(EXTRA_POST_LIST_TYPE) as PostListType + postListType = requireNotNull(arguments?.getSerializableCompat(EXTRA_POST_LIST_TYPE)) if (postListType == SEARCH) { recyclerView?.id = R.id.posts_search_recycler_view_id } - mainViewModel = ViewModelProvider(nonNullActivity, viewModelFactory) - .get(PostListMainViewModel::class.java) + mainViewModel = ViewModelProvider(nonNullActivity, viewModelFactory)[PostListMainViewModel::class.java] mainViewModel.viewLayoutType.observe(viewLifecycleOwner, Observer { optionaLayoutType -> optionaLayoutType?.let { layoutType -> @@ -126,19 +127,19 @@ class PostListFragment : ViewPagerFragment() { } }) - mainViewModel.authorSelectionUpdated.observe(viewLifecycleOwner, Observer { + mainViewModel.authorSelectionUpdated.observe(viewLifecycleOwner) { if (it != null) { if (viewModel.updateAuthorFilterIfNotSearch(it)) { recyclerView?.scrollToPosition(0) } } - }) + } actionableEmptyView?.updateLayoutForSearch(postListType == SEARCH, 0) val postListViewModelConnector = mainViewModel.getPostListViewModelConnector(postListType) - viewModel = ViewModelProvider(this, viewModelFactory).get(PostListViewModel::class.java) + viewModel = ViewModelProvider(this, viewModelFactory)[PostListViewModel::class.java] val displayWidth = DisplayUtils.getWindowPixelWidth(requireContext()) val contentSpacing = nonNullActivity.resources.getDimensionPixelSize(R.dimen.content_margin) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostNotificationScheduleTimeDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostNotificationScheduleTimeDialogFragment.kt index 2f736ec0a560..1b408616310f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostNotificationScheduleTimeDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostNotificationScheduleTimeDialogFragment.kt @@ -15,6 +15,7 @@ import org.wordpress.android.fluxc.store.PostSchedulingNotificationStore.Schedul import org.wordpress.android.fluxc.store.PostSchedulingNotificationStore.SchedulingReminderModel.Period.TEN_MINUTES import org.wordpress.android.fluxc.store.PostSchedulingNotificationStore.SchedulingReminderModel.Period.WHEN_PUBLISHED import org.wordpress.android.ui.posts.prepublishing.PrepublishingPublishSettingsViewModel +import org.wordpress.android.util.extensions.getParcelableCompat import javax.inject.Inject class PostNotificationScheduleTimeDialogFragment : DialogFragment() { @@ -23,15 +24,19 @@ class PostNotificationScheduleTimeDialogFragment : DialogFragment() { private lateinit var viewModel: PublishSettingsViewModel override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val publishSettingsFragmentType = arguments?.getParcelable( + val publishSettingsFragmentType = arguments?.getParcelableCompat( ARG_PUBLISH_SETTINGS_FRAGMENT_TYPE ) viewModel = when (publishSettingsFragmentType) { - PublishSettingsFragmentType.EDIT_POST -> ViewModelProvider(requireActivity(), viewModelFactory) - .get(EditPostPublishSettingsViewModel::class.java) - PublishSettingsFragmentType.PREPUBLISHING_NUDGES -> ViewModelProvider(requireActivity(), viewModelFactory) - .get(PrepublishingPublishSettingsViewModel::class.java) + PublishSettingsFragmentType.EDIT_POST -> ViewModelProvider( + requireActivity(), + viewModelFactory + )[EditPostPublishSettingsViewModel::class.java] + PublishSettingsFragmentType.PREPUBLISHING_NUDGES -> ViewModelProvider( + requireActivity(), + viewModelFactory + )[PrepublishingPublishSettingsViewModel::class.java] null -> error("PublishSettingsViewModel not initialized") } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostSettingsTagsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostSettingsTagsActivity.java index db3e82ff28a8..6c6d0674db5d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostSettingsTagsActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostSettingsTagsActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.view.MenuItem; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -14,6 +15,7 @@ import org.wordpress.android.fluxc.model.SiteModel; import org.wordpress.android.ui.LocaleAwareActivity; import org.wordpress.android.util.ToastUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; public class PostSettingsTagsActivity extends LocaleAwareActivity implements TagsSelectedListener { public static final String KEY_TAGS = "KEY_TAGS"; @@ -25,6 +27,15 @@ public class PostSettingsTagsActivity extends LocaleAwareActivity implements Tag public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + saveAndFinish(); + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + if (savedInstanceState == null) { mSite = (SiteModel) getIntent().getSerializableExtra(WordPress.SITE); mTags = getIntent().getStringExtra(KEY_TAGS); @@ -77,12 +88,6 @@ public boolean onOptionsItemSelected(final MenuItem item) { return super.onOptionsItemSelected(item); } - @Override - public void onBackPressed() { - saveAndFinish(); - super.onBackPressed(); - } - private void saveAndFinish() { closeKeyboard(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostTimePickerDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostTimePickerDialogFragment.kt index 43da4c08fff9..f22fff7d9373 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostTimePickerDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostTimePickerDialogFragment.kt @@ -2,7 +2,6 @@ package org.wordpress.android.ui.posts import android.app.Dialog import android.app.TimePickerDialog -import android.app.TimePickerDialog.OnTimeSetListener import android.content.Context import android.os.Bundle import android.text.format.DateFormat @@ -13,6 +12,7 @@ import org.wordpress.android.R.style import org.wordpress.android.WordPress import org.wordpress.android.ui.posts.prepublishing.PrepublishingPublishSettingsViewModel +import org.wordpress.android.util.extensions.getParcelableCompat import javax.inject.Inject class PostTimePickerDialogFragment : DialogFragment() { @@ -21,30 +21,31 @@ class PostTimePickerDialogFragment : DialogFragment() { private lateinit var viewModel: PublishSettingsViewModel override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val publishSettingsFragmentType = arguments?.getParcelable( + val publishSettingsFragmentType = arguments?.getParcelableCompat( ARG_PUBLISH_SETTINGS_FRAGMENT_TYPE ) viewModel = when (publishSettingsFragmentType) { - PublishSettingsFragmentType.EDIT_POST -> ViewModelProvider(requireActivity(), viewModelFactory) - .get(EditPostPublishSettingsViewModel::class.java) - PublishSettingsFragmentType.PREPUBLISHING_NUDGES -> ViewModelProvider(requireActivity(), viewModelFactory) - .get(PrepublishingPublishSettingsViewModel::class.java) + PublishSettingsFragmentType.EDIT_POST -> ViewModelProvider( + requireActivity(), + viewModelFactory + )[EditPostPublishSettingsViewModel::class.java] + PublishSettingsFragmentType.PREPUBLISHING_NUDGES -> ViewModelProvider( + requireActivity(), + viewModelFactory + )[PrepublishingPublishSettingsViewModel::class.java] null -> error("PublishSettingsViewModel not initialized") } val is24HrFormat = DateFormat.is24HourFormat(activity) val context = ContextThemeWrapper(activity, style.PostSettingsCalendar) - val timePickerDialog = TimePickerDialog( + return TimePickerDialog( context, - OnTimeSetListener { _, selectedHour, selectedMinute -> - viewModel.onTimeSelected(selectedHour, selectedMinute) - }, + { _, selectedHour, selectedMinute -> viewModel.onTimeSelected(selectedHour, selectedMinute) }, viewModel.hour ?: 0, viewModel.minute ?: 0, is24HrFormat ) - return timePickerDialog } override fun onAttach(context: Context) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt index 290772f67fbf..49a806cfd899 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt @@ -60,6 +60,8 @@ import org.wordpress.android.ui.utils.UiString import org.wordpress.android.util.AppLog import org.wordpress.android.util.SnackbarItem import org.wordpress.android.util.SnackbarSequencer +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.extensions.redirectContextClickToLongPressListener import org.wordpress.android.util.extensions.setLiftOnScrollTargetViewIdAndRequestLayout import org.wordpress.android.viewmodel.observeEvent @@ -165,7 +167,7 @@ class PostsListActivity : LocaleAwareActivity(), } private fun restartWhenSiteHasChanged(intent: Intent) { - val site = intent.getSerializableExtra(WordPress.SITE) as SiteModel + val site = requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) if (site.id != this.site.id) { finish() startActivity(intent) @@ -180,14 +182,14 @@ class PostsListActivity : LocaleAwareActivity(), setContentView(root) binding = this - site = if (savedInstanceState == null) { - checkNotNull(intent.getSerializableExtra(WordPress.SITE) as? SiteModel) { - "SiteModel cannot be null, check the PendingIntent starting PostsListActivity" + site = requireNotNull( + if (savedInstanceState == null) { + intent.getSerializableExtraCompat(WordPress.SITE) + } else { + restorePreviousSearch = true + savedInstanceState.getSerializableCompat(WordPress.SITE) } - } else { - restorePreviousSearch = true - savedInstanceState.getSerializable(WordPress.SITE) as SiteModel - } + ) { "SiteModel cannot be null, check the PendingIntent starting PostsListActivity" } val initPreviewState = if (savedInstanceState == null) { PostListRemotePreviewState.NONE @@ -477,8 +479,9 @@ class PostsListActivity : LocaleAwareActivity(), private fun loadIntentData(intent: Intent) { if (intent.hasExtra(ARG_NOTIFICATION_TYPE)) { - val notificationType: NotificationType = - intent.getSerializableExtra(ARG_NOTIFICATION_TYPE) as NotificationType + val notificationType = requireNotNull( + intent.getSerializableExtraCompat(ARG_NOTIFICATION_TYPE) + ) systemNotificationTracker.trackTappedNotification(notificationType) } @@ -537,7 +540,7 @@ class PostsListActivity : LocaleAwareActivity(), override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } else if (item.itemId == R.id.toggle_post_list_item_layout) { viewModel.toggleViewLayout() @@ -580,12 +583,12 @@ class PostsListActivity : LocaleAwareActivity(), private fun PostListActivityBinding.initSearchView() { searchActionButton.setOnActionExpandListener(object : OnActionExpandListener { - override fun onMenuItemActionExpand(item: MenuItem?): Boolean { + override fun onMenuItemActionExpand(item: MenuItem): Boolean { viewModel.onSearchExpanded(restorePreviousSearch) return true } - override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { + override fun onMenuItemActionCollapse(item: MenuItem): Boolean { viewModel.onSearchCollapsed() return true } @@ -609,10 +612,10 @@ class PostsListActivity : LocaleAwareActivity(), } }) - viewModel.isSearchExpanded.observe(this@PostsListActivity, { isExpanded -> + viewModel.isSearchExpanded.observe(this@PostsListActivity) { isExpanded -> toggleViewLayoutMenuItem.isVisible = !isExpanded toggleSearch(isExpanded) - }) + } } private fun PostListActivityBinding.toggleSearch(isExpanded: Boolean) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingAddCategoryFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingAddCategoryFragment.kt index ed5e7b3b89e0..abcacf66bc18 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingAddCategoryFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingAddCategoryFragment.kt @@ -21,6 +21,7 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.ActivityUtils import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.ToastUtils.Duration.SHORT +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -137,15 +138,19 @@ class PrepublishingAddCategoryFragment : Fragment(R.layout.prepublishing_add_cat } private fun PrepublishingAddCategoryFragmentBinding.initViewModel() { - viewModel = ViewModelProvider(this@PrepublishingAddCategoryFragment, viewModelFactory) - .get(PrepublishingAddCategoryViewModel::class.java) - parentViewModel = ViewModelProvider(requireParentFragment(), viewModelFactory) - .get(PrepublishingViewModel::class.java) + viewModel = ViewModelProvider( + this@PrepublishingAddCategoryFragment, + viewModelFactory + )[PrepublishingAddCategoryViewModel::class.java] + parentViewModel = ViewModelProvider( + requireParentFragment(), + viewModelFactory + )[PrepublishingViewModel::class.java] startObserving() val needsRequestLayout = requireArguments().getBoolean(PrepublishingTagsFragment.NEEDS_REQUEST_LAYOUT) - val siteModel = requireArguments().getSerializable(WordPress.SITE) as SiteModel + val siteModel = requireNotNull(arguments?.getSerializableCompat(WordPress.SITE)) viewModel.start(siteModel, !needsRequestLayout) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingBottomSheetFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingBottomSheetFragment.kt index cf6d17cb2e6c..bd1094d0b0ee 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingBottomSheetFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingBottomSheetFragment.kt @@ -28,6 +28,8 @@ import org.wordpress.android.ui.posts.prepublishing.PrepublishingPublishSettings import org.wordpress.android.util.ActivityUtils import org.wordpress.android.util.KeyboardResizeViewUtil import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -133,30 +135,28 @@ class PrepublishingBottomSheetFragment : WPBottomSheetDialogFragment(), } private fun initViewModel(savedInstanceState: Bundle?) { - viewModel = ViewModelProvider(this, viewModelFactory) - .get(PrepublishingViewModel::class.java) + viewModel = ViewModelProvider(this, viewModelFactory)[PrepublishingViewModel::class.java] - viewModel.navigationTarget.observeEvent(this, { navigationState -> + viewModel.navigationTarget.observeEvent(this) { navigationState -> navigateToScreen(navigationState) - }) + } - viewModel.dismissBottomSheet.observeEvent(this, { + viewModel.dismissBottomSheet.observeEvent(this) { dismiss() - }) + } - viewModel.triggerOnSubmitButtonClickedListener.observeEvent(this, { publishPost -> + viewModel.triggerOnSubmitButtonClickedListener.observeEvent(this) { publishPost -> prepublishingBottomSheetListener?.onSubmitButtonClicked(publishPost) - }) + } - viewModel.dismissKeyboard.observeEvent(this, { + viewModel.dismissKeyboard.observeEvent(this) { ActivityUtils.hideKeyboardForced(view) - }) + } - val prepublishingScreenState = savedInstanceState?.getParcelable( + val prepublishingScreenState = savedInstanceState?.getParcelableCompat( KEY_SCREEN_STATE ) - val site = arguments?.getSerializable(SITE) as SiteModel - + val site = requireNotNull(arguments?.getSerializableCompat(SITE)) viewModel.start(site, prepublishingScreenState) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingCategoriesFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingCategoriesFragment.kt index 509fe77e4fb3..00d787313280 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingCategoriesFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PrepublishingCategoriesFragment.kt @@ -24,6 +24,7 @@ import org.wordpress.android.ui.posts.PrepublishingHomeItemUiState.ActionType.AD import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.ToastUtils.Duration.SHORT +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -116,14 +117,17 @@ class PrepublishingCategoriesFragment : Fragment(R.layout.prepublishing_categori } private fun PrepublishingCategoriesFragmentBinding.initViewModel() { - viewModel = ViewModelProvider(this@PrepublishingCategoriesFragment, viewModelFactory) - .get(PrepublishingCategoriesViewModel::class.java) - parentViewModel = ViewModelProvider(requireParentFragment(), viewModelFactory) - .get(PrepublishingViewModel::class.java) + viewModel = ViewModelProvider( + this@PrepublishingCategoriesFragment, + viewModelFactory + )[PrepublishingCategoriesViewModel::class.java] + parentViewModel = ViewModelProvider( + requireParentFragment(), + viewModelFactory + )[PrepublishingViewModel::class.java] startObserving() - val siteModel = requireArguments().getSerializable(WordPress.SITE) as SiteModel - val addCategoryRequest: PrepublishingAddCategoryRequest? = - arguments?.getSerializable(ADD_CATEGORY_REQUEST) as? PrepublishingAddCategoryRequest + val siteModel = requireNotNull(arguments?.getSerializableCompat(WordPress.SITE)) + val addCategoryRequest = arguments?.getSerializableCompat(ADD_CATEGORY_REQUEST) val selectedCategoryIds: List = arguments?.getLongArray(SELECTED_CATEGORY_IDS)?.toList() ?: listOf() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java index f71f0af6dcaf..3042107eacc8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java @@ -10,6 +10,7 @@ import android.widget.ListView; import android.widget.TextView; +import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; @@ -35,6 +36,7 @@ import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.ToastUtils.Duration; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.util.helpers.ListScrollPositionManager; import org.wordpress.android.util.helpers.SwipeToRefreshHelper; import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener; @@ -69,6 +71,16 @@ public class SelectCategoriesActivity extends LocaleAwareActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((WordPress) getApplication()).component().inject(this); + + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + saveAndFinish(); + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + mDispatcher.register(this); if (savedInstanceState == null) { @@ -237,12 +249,6 @@ private void refreshCategories() { mDispatcher.dispatch(TaxonomyActionBuilder.newFetchCategoriesAction(mSite)); } - @Override - public void onBackPressed() { - saveAndFinish(); - super.onBackPressed(); - } - private void updateSelectedCategoryList() { SparseBooleanArray selectedItems = mListView.getCheckedItemPositions(); for (int i = 0; i < selectedItems.size(); i++) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AccountSettingsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AccountSettingsActivity.java index c5b9fb9d979a..6fd2a3b7a3cf 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AccountSettingsActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AccountSettingsActivity.java @@ -29,7 +29,7 @@ public void onCreate(Bundle savedInstanceState) { @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsActivity.java index 19066a83c25f..37a291651a38 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppSettingsActivity.java @@ -35,7 +35,7 @@ public void onCreate(Bundle savedInstanceState) { @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/MyProfileActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MyProfileActivity.java index b16ea68032ef..03e50ff2e6b1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/MyProfileActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/MyProfileActivity.java @@ -39,7 +39,7 @@ public void onCreate(Bundle savedInstanceState) { @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsTagListActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsTagListActivity.java index 3b567c9c4a0c..fa56f4935322 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsTagListActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsTagListActivity.java @@ -16,6 +16,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; @@ -50,6 +51,7 @@ import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.util.extensions.ViewExtensionsKt; import java.util.ArrayList; @@ -98,6 +100,24 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.site_settings_tag_list_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (getFragmentManager().getBackStackEntryCount() > 0) { + SiteSettingsTagDetailFragment fragment = getDetailFragment(); + if (fragment != null && fragment.hasChanges()) { + saveTag(fragment.getTerm(), fragment.isNewTerm()); + } else { + hideDetailFragment(); + loadTags(); + } + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + Toolbar toolbar = findViewById(R.id.toolbar_main); setSupportActionBar(toolbar); @@ -217,28 +237,13 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } else { return super.onOptionsItemSelected(item); } } - @Override - public void onBackPressed() { - if (getFragmentManager().getBackStackEntryCount() > 0) { - SiteSettingsTagDetailFragment fragment = getDetailFragment(); - if (fragment != null && fragment.hasChanges()) { - saveTag(fragment.getTerm(), fragment.isNewTerm()); - } else { - hideDetailFragment(); - loadTags(); - } - } else { - super.onBackPressed(); - } - } - private void showFabIfHidden() { // redisplay hidden fab after a short delay long delayMs = getResources().getInteger(R.integer.fab_animation_delay); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/detail/CategoryDetailActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/detail/CategoryDetailActivity.kt index d7a9c347a051..80d8e1d9a497 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/detail/CategoryDetailActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/detail/CategoryDetailActivity.kt @@ -22,7 +22,7 @@ class CategoryDetailActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListActivity.kt index 5cf95ad7e8d2..ace469515a1f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListActivity.kt @@ -22,7 +22,7 @@ class CategoriesListActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListFragment.kt index 78eb781534f4..3f1b5666f233 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/categories/list/CategoriesListFragment.kt @@ -17,6 +17,8 @@ import org.wordpress.android.ui.prefs.categories.list.CategoryDetailNavigation.E import org.wordpress.android.ui.prefs.categories.list.UiState.Content import org.wordpress.android.ui.prefs.categories.list.UiState.Loading import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject @AndroidEntryPoint @@ -68,11 +70,14 @@ class CategoriesListFragment : Fragment(R.layout.site_settings_categories_list_f } private fun getSite(savedInstanceState: Bundle?): SiteModel { - return if (savedInstanceState == null) { - requireActivity().intent.getSerializableExtra(WordPress.SITE) as SiteModel - } else { - savedInstanceState.getSerializable(WordPress.SITE) as SiteModel - } + val site = requireNotNull( + if (savedInstanceState == null) { + requireActivity().intent.getSerializableExtraCompat(WordPress.SITE) + } else { + savedInstanceState.getSerializableCompat(WordPress.SITE) + } + ) + return site } private fun SiteSettingsCategoriesListFragmentBinding.setupObservers() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/homepage/HomepageSettingsDialog.kt b/WordPress/src/main/java/org/wordpress/android/ui/prefs/homepage/HomepageSettingsDialog.kt index 4f15c7c921d0..58525591ee05 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/homepage/HomepageSettingsDialog.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/homepage/HomepageSettingsDialog.kt @@ -39,9 +39,9 @@ class HomepageSettingsDialog : DialogFragment() { var pageForPostsId: Long? = null (arguments ?: savedInstanceState)?.let { bundle -> siteId = bundle.getInt(KEY_SITE_ID) - isClassicBlog = bundle.get(KEY_IS_CLASSIC_BLOG)?.let { it as Boolean } - pageOnFrontId = bundle.get(KEY_PAGE_ON_FRONT)?.let { it as Long } - pageForPostsId = bundle.get(KEY_PAGE_FOR_POSTS)?.let { it as Long } + isClassicBlog = bundle.getBoolean(KEY_IS_CLASSIC_BLOG) + pageOnFrontId = bundle.getLong(KEY_PAGE_ON_FRONT) + pageForPostsId = bundle.getLong(KEY_PAGE_FOR_POSTS) } ?: throw IllegalArgumentException("Site has to be initialized") val builder = MaterialAlertDialogBuilder(requireActivity()) builder.setPositiveButton(R.string.site_settings_accept_homepage) { _, _ -> } @@ -55,8 +55,10 @@ class HomepageSettingsDialog : DialogFragment() { } builder.setView(root) - viewModel = ViewModelProvider(this@HomepageSettingsDialog, viewModelFactory) - .get(HomepageSettingsViewModel::class.java) + viewModel = ViewModelProvider( + this@HomepageSettingsDialog, + viewModelFactory + )[HomepageSettingsViewModel::class.java] viewModel.uiState.observe(this@HomepageSettingsDialog) { uiState -> uiState?.let { loadingPages.visibility = if (uiState.isLoading) View.VISIBLE else View.GONE diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/notifications/NotificationsSettingsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/prefs/notifications/NotificationsSettingsActivity.kt index 6f0a71f774a9..09d5663e78e1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/notifications/NotificationsSettingsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/notifications/NotificationsSettingsActivity.kt @@ -76,7 +76,7 @@ class NotificationsSettingsActivity : LocaleAwareActivity(), MainSwitchToolbarLi override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java index 0c8a7d88bdea..f81060a7077e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeListActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.view.MenuItem; +import androidx.activity.OnBackPressedCallback; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; @@ -38,6 +39,7 @@ import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; import org.wordpress.android.util.extensions.AppBarLayoutExtensionsKt; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import java.util.HashMap; import java.util.Map; @@ -67,6 +69,18 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.publicize_list_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + getSupportFragmentManager().popBackStack(); + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + Toolbar toolbar = findViewById(R.id.toolbar_main); setSupportActionBar(toolbar); @@ -209,21 +223,12 @@ private void closeWebViewFragment() { public boolean onOptionsItemSelected(final MenuItem item) { int itemId = item.getItemId(); if (itemId == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); } - @Override - public void onBackPressed() { - if (getSupportFragmentManager().getBackStackEntryCount() > 0) { - getSupportFragmentManager().popBackStack(); - } else { - super.onBackPressed(); - } - } - /* * user tapped a service in the list fragment */ diff --git a/WordPress/src/main/java/org/wordpress/android/ui/qrcodeauth/QRCodeAuthFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/qrcodeauth/QRCodeAuthFragment.kt index 1398c43c489d..2ecb5e21c959 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/qrcodeauth/QRCodeAuthFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/qrcodeauth/QRCodeAuthFragment.kt @@ -4,7 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -115,14 +115,9 @@ class QRCodeAuthFragment : Fragment() { } private fun initBackPressHandler() { - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - qrCodeAuthViewModel.onBackPressed() - } - } - ) + requireActivity().onBackPressedDispatcher.addCallback(this) { + qrCodeAuthViewModel.onBackPressed() + } } override fun onSaveInstanceState(outState: Bundle) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/quickstart/QuickStartFullScreenDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/quickstart/QuickStartFullScreenDialogFragment.kt index 6b36462f4e75..6b13a36ff9a7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/quickstart/QuickStartFullScreenDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/quickstart/QuickStartFullScreenDialogFragment.kt @@ -15,7 +15,6 @@ import org.wordpress.android.fluxc.store.QuickStartStore import org.wordpress.android.fluxc.store.QuickStartStore.QuickStartNewSiteTask.CREATE_SITE import org.wordpress.android.fluxc.store.QuickStartStore.QuickStartTask import org.wordpress.android.fluxc.store.QuickStartStore.QuickStartTaskType -import org.wordpress.android.fluxc.store.QuickStartStore.QuickStartTaskType.UNKNOWN import org.wordpress.android.ui.FullScreenDialogFragment.FullScreenDialogContent import org.wordpress.android.ui.FullScreenDialogFragment.FullScreenDialogController import org.wordpress.android.ui.mysite.SelectedSiteRepository @@ -28,6 +27,7 @@ import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.util.DisplayUtilsWrapper import org.wordpress.android.util.QuickStartUtils.getQuickStartListSkippedTracker import org.wordpress.android.util.QuickStartUtils.getQuickStartListTappedTracker +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.widgets.WPSnackbar.Companion.make import java.io.Serializable import javax.inject.Inject @@ -74,7 +74,7 @@ class QuickStartFullScreenDialogFragment : Fragment(R.layout.quick_start_dialog_ } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - tasksType = arguments?.getSerializable(EXTRA_TYPE) as QuickStartTaskType? ?: QuickStartTaskType.UNKNOWN + tasksType = arguments?.getSerializableCompat(EXTRA_TYPE) ?: QuickStartTaskType.UNKNOWN quickStartTracker.trackQuickStartListViewed(tasksType) binding.setupQuickStartList() } @@ -150,7 +150,7 @@ class QuickStartFullScreenDialogFragment : Fragment(R.layout.quick_start_dialog_ ) private fun buildTaskCards(): List { - val tasks = QuickStartTask.getTasksByTaskType(tasksType).filterNot { it.taskType == UNKNOWN } + val tasks = QuickStartTask.getTasksByTaskType(tasksType).filterNot { it.taskType == QuickStartTaskType.UNKNOWN } val selectedSiteLocalId = selectedSiteRepository.getSelectedSiteLocalId().toLong() val tasksCompleted = quickStartStore.getCompletedTasksByType(selectedSiteLocalId, tasksType) return tasks.mapToQuickStartTaskCard(tasksCompleted) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.java index 754090bed0eb..1d367c951a46 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.java @@ -18,6 +18,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; @@ -86,10 +87,11 @@ import org.wordpress.android.util.EditTextUtils; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.ToastUtils; -import org.wordpress.android.util.extensions.ViewExtensionsKt; import org.wordpress.android.util.WPActivityUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; import org.wordpress.android.util.analytics.AnalyticsUtils.AnalyticsCommentActionSource; +import org.wordpress.android.util.extensions.CompatExtensionsKt; +import org.wordpress.android.util.extensions.ViewExtensionsKt; import org.wordpress.android.util.helpers.SwipeToRefreshHelper; import org.wordpress.android.widgets.RecyclerItemDecoration; import org.wordpress.android.widgets.SuggestionAutoCompleteText; @@ -150,24 +152,27 @@ public class ReaderCommentListActivity extends LocaleAwareActivity implements On private ReaderCommentListViewModel mViewModel; private ConversationNotificationsViewModel mConversationViewModel; - @Override - public void onBackPressed() { - CollapseFullScreenDialogFragment fragment = (CollapseFullScreenDialogFragment) - getSupportFragmentManager().findFragmentByTag(CollapseFullScreenDialogFragment.TAG); - - if (fragment != null) { - fragment.onBackPressed(); - } else { - super.onBackPressed(); - } - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((WordPress) getApplication()).component().inject(this); setContentView(R.layout.reader_activity_comment_list); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + CollapseFullScreenDialogFragment fragment = (CollapseFullScreenDialogFragment) + getSupportFragmentManager().findFragmentByTag(CollapseFullScreenDialogFragment.TAG); + + if (fragment != null) { + fragment.collapse(); + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + Toolbar toolbar = findViewById(R.id.toolbar_main); setSupportActionBar(toolbar); @@ -248,9 +253,7 @@ public void afterTextChanged(Editable s) { mSuggestionServiceConnectionManager, mPost.isWP() ); - if (mSuggestionAdapter != null) { - mEditComment.setAdapter(mSuggestionAdapter); - } + mEditComment.setAdapter(mSuggestionAdapter); mReaderTracker.trackPost(AnalyticsTracker.Stat.READER_ARTICLE_COMMENTS_OPENED, mPost, mSource); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFragment.kt index 706d83a6b680..28b304990b40 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFragment.kt @@ -24,6 +24,7 @@ import org.greenrobot.eventbus.ThreadMode.MAIN import org.wordpress.android.R import org.wordpress.android.R.string import org.wordpress.android.databinding.ReaderFragmentLayoutBinding +import org.wordpress.android.models.JetpackPoweredScreen import org.wordpress.android.models.ReaderTagList import org.wordpress.android.ui.ScrollableViewInitializedListener import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureFullScreenOverlayFragment @@ -44,7 +45,6 @@ import org.wordpress.android.ui.reader.viewmodels.ReaderViewModel.ReaderUiState. import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.ui.utils.UiString.UiStringText import org.wordpress.android.util.JetpackBrandingUtils -import org.wordpress.android.models.JetpackPoweredScreen import org.wordpress.android.util.QuickStartUtilsWrapper import org.wordpress.android.util.SnackbarItem import org.wordpress.android.util.SnackbarItem.Action @@ -126,11 +126,11 @@ class ReaderFragment : Fragment(R.layout.reader_fragment_layout), MenuProvider, } menu.findItem(R.id.menu_settings).apply { settingsMenuItem = this - settingsMenuItemFocusPoint = this.actionView.findViewById(R.id.menu_quick_start_focus_point) + settingsMenuItemFocusPoint = this.actionView?.findViewById(R.id.menu_quick_start_focus_point) this.isVisible = viewModel.uiState.value?.settingsMenuItemUiState?.isVisible ?: false settingsMenuItemFocusPoint?.isVisible = viewModel.uiState.value?.settingsMenuItemUiState?.showQuickStartFocusPoint ?: false - this.actionView.setOnClickListener { viewModel.onSettingsActionClicked() } + this.actionView?.setOnClickListener { viewModel.onSettingsActionClicked() } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java index 3fa2eedc8b54..9e8dc104c46c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPhotoViewerActivity.java @@ -158,7 +158,7 @@ public void onAnimationRepeat(Animation animation) { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt index f090619b06e0..4485c9e38b5d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt @@ -132,6 +132,8 @@ import org.wordpress.android.util.WPSwipeToRefreshHelper.buildSwipeToRefreshHelp import org.wordpress.android.util.config.CommentsSnippetFeatureConfig import org.wordpress.android.util.config.LikesEnhancementsFeatureConfig import org.wordpress.android.util.extensions.getColorFromAttribute +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.extensions.isDarkTheme import org.wordpress.android.util.extensions.setVisible import org.wordpress.android.util.helpers.SwipeToRefreshHelper @@ -317,12 +319,14 @@ class ReaderPostDetailFragment : ViewPagerFragment(), if (args != null) { blogId = args.getLong(ReaderConstants.ARG_BLOG_ID) postId = args.getLong(ReaderConstants.ARG_POST_ID) - directOperation = args.getSerializable(ReaderConstants.ARG_DIRECT_OPERATION) as? DirectOperation + directOperation = args.getSerializableCompat(ReaderConstants.ARG_DIRECT_OPERATION) commentId = args.getInt(ReaderConstants.ARG_COMMENT_ID) isRelatedPost = args.getBoolean(ReaderConstants.ARG_IS_RELATED_POST) interceptedUri = args.getString(ReaderConstants.ARG_INTERCEPTED_URI) if (args.containsKey(ReaderConstants.ARG_POST_LIST_TYPE)) { - this.postListType = args.getSerializable(ReaderConstants.ARG_POST_LIST_TYPE) as ReaderPostListType + postListType = requireNotNull( + args.getSerializableCompat(ReaderConstants.ARG_POST_LIST_TYPE) + ) } postSlugsResolutionUnderway = args.getBoolean(ReaderConstants.KEY_POST_SLUGS_RESOLUTION_UNDERWAY) } @@ -400,7 +404,7 @@ class ReaderPostDetailFragment : ViewPagerFragment(), toolBar.setTitle(R.string.reader_title_related_post_detail) } else { toolBar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp) - toolBar.setNavigationOnClickListener { requireActivity().onBackPressed() } + toolBar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() } } } @@ -499,7 +503,7 @@ class ReaderPostDetailFragment : ViewPagerFragment(), private fun initLikeFacesRecycler(savedInstanceState: Bundle?) { if (!likesEnhancementsFeatureConfig.isEnabled()) return val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) - savedInstanceState?.getParcelable(KEY_LIKERS_LIST_STATE)?.let { + savedInstanceState?.getParcelableCompat(KEY_LIKERS_LIST_STATE)?.let { layoutManager.onRestoreInstanceState(it) } @@ -518,7 +522,7 @@ class ReaderPostDetailFragment : ViewPagerFragment(), if (!commentsSnippetFeatureConfig.isEnabled()) return val layoutManager = LinearLayoutManager(activity) - savedInstanceState?.getParcelable(KEY_COMMENTS_SNIPPET_LIST_STATE)?.let { + savedInstanceState?.getParcelableCompat(KEY_COMMENTS_SNIPPET_LIST_STATE)?.let { layoutManager.onRestoreInstanceState(it) } @@ -1082,8 +1086,7 @@ class ReaderPostDetailFragment : ViewPagerFragment(), savedInstanceState?.let { blogId = it.getLong(ReaderConstants.ARG_BLOG_ID) postId = it.getLong(ReaderConstants.ARG_POST_ID) - directOperation = it - .getSerializable(ReaderConstants.ARG_DIRECT_OPERATION) as? DirectOperation + directOperation = it.getSerializableCompat(ReaderConstants.ARG_DIRECT_OPERATION) commentId = it.getInt(ReaderConstants.ARG_COMMENT_ID) isRelatedPost = it.getBoolean(ReaderConstants.ARG_IS_RELATED_POST) interceptedUri = it.getString(ReaderConstants.ARG_INTERCEPTED_URI) @@ -1092,7 +1095,7 @@ class ReaderPostDetailFragment : ViewPagerFragment(), hasTrackedGlobalRelatedPosts = it.getBoolean(ReaderConstants.KEY_ALREADY_TRACKED_GLOBAL_RELATED_POSTS) hasTrackedLocalRelatedPosts = it.getBoolean(ReaderConstants.KEY_ALREADY_TRACKED_LOCAL_RELATED_POSTS) if (it.containsKey(ReaderConstants.ARG_POST_LIST_TYPE)) { - this.postListType = it.getSerializable(ReaderConstants.ARG_POST_LIST_TYPE) as ReaderPostListType + postListType = requireNotNull(it.getSerializableCompat(ReaderConstants.ARG_POST_LIST_TYPE)) } if (it.containsKey(ReaderConstants.KEY_ERROR_MESSAGE)) { errorMessage = it.getString(ReaderConstants.KEY_ERROR_MESSAGE) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListActivity.java index f84c7c373756..9f3a8e422bfe 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListActivity.java @@ -8,6 +8,7 @@ import android.view.MenuItem; import android.view.View; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -41,6 +42,7 @@ import org.wordpress.android.ui.uploads.UploadUtils; import org.wordpress.android.ui.uploads.UploadUtilsWrapper; import org.wordpress.android.util.ToastUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import javax.inject.Inject; @@ -67,6 +69,17 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.reader_activity_post_list); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + ReaderPostListFragment fragment = getListFragment(); + if (fragment == null || !fragment.onActivityBackPressed()) { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + Toolbar toolbar = findViewById(R.id.toolbar_main); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); @@ -188,14 +201,6 @@ public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); } - @Override - public void onBackPressed() { - ReaderPostListFragment fragment = getListFragment(); - if (fragment == null || !fragment.onActivityBackPressed()) { - super.onBackPressed(); - } - } - @Override public boolean onCreateOptionsMenu(Menu menu) { if (getPostListType() == ReaderPostListType.BLOG_PREVIEW) { @@ -209,7 +214,7 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; case R.id.menu_share: shareSite(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.java index 4b0d69038fc5..405526da76d2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.java @@ -13,6 +13,7 @@ import android.view.ViewGroup; import android.widget.ProgressBar; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -78,6 +79,7 @@ import org.wordpress.android.util.WPActivityUtils; import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper; import org.wordpress.android.util.config.SeenUnseenWithCounterFeatureConfig; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.widgets.WPSwipeSnackbar; import org.wordpress.android.widgets.WPViewPager; import org.wordpress.android.widgets.WPViewPagerTransformer; @@ -177,6 +179,24 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.reader_activity_post_pager); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + ReaderPostDetailFragment fragment = getActiveDetailFragment(); + if (fragment != null && fragment.isCustomViewShowing()) { + // if full screen video is showing, hide the custom view rather than navigate back + fragment.hideCustomView(); + } else { + if (fragment != null && fragment.goBackInPostHistory()) { + // noop - fragment moved back to a previous post + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + // Start migration flow passing deep link data if requirements are met if (mJetpackAppMigrationFlowUtils.shouldShowMigrationFlow()) { PreMigrationDeepLinkData deepLinkData = new PreMigrationDeepLinkData( @@ -693,21 +713,6 @@ private ReaderBlogIdPostId getAdapterBlogIdPostIdAtPosition(int position) { return adapter.getBlogIdPostIdAtPosition(position); } - @Override - public void onBackPressed() { - ReaderPostDetailFragment fragment = getActiveDetailFragment(); - if (fragment != null && fragment.isCustomViewShowing()) { - // if full screen video is showing, hide the custom view rather than navigate back - fragment.hideCustomView(); - } else { - if (fragment != null && fragment.goBackInPostHistory()) { - // noop - fragment moved back to a previous post - } else { - super.onBackPressed(); - } - } - } - /* * perform analytics tracking and bump the page view for the post at the passed position * if it hasn't already been done diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderSubsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderSubsActivity.java index f07cb273da73..b3fa4d9de841 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderSubsActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderSubsActivity.java @@ -10,6 +10,7 @@ import android.widget.EditText; import android.widget.ProgressBar; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; @@ -54,6 +55,7 @@ import org.wordpress.android.util.EditTextUtils; import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.UrlUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.widgets.WPSnackbar; import org.wordpress.android.widgets.WPViewPager; @@ -93,6 +95,18 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((WordPress) getApplication()).component().inject(this); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (!TextUtils.isEmpty(mLastAddedTagName)) { + EventBus.getDefault().postSticky(new ReaderEvents.TagAdded(mLastAddedTagName)); + } + mReaderTracker.track(Stat.READER_MANAGE_VIEW_DISMISSED); + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + setContentView(R.layout.reader_activity_subs); restoreState(savedInstanceState); @@ -107,7 +121,7 @@ protected void onCreate(Bundle savedInstanceState) { Toolbar toolbar = findViewById(R.id.toolbar_main); if (toolbar != null) { setSupportActionBar(toolbar); - toolbar.setNavigationOnClickListener(v -> onBackPressed()); + toolbar.setNavigationOnClickListener(v -> getOnBackPressedDispatcher().onBackPressed()); } ActionBar actionBar = getSupportActionBar(); @@ -236,15 +250,6 @@ public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); } - @Override - public void onBackPressed() { - if (!TextUtils.isEmpty(mLastAddedTagName)) { - EventBus.getDefault().postSticky(new ReaderEvents.TagAdded(mLastAddedTagName)); - } - mReaderTracker.track(Stat.READER_MANAGE_VIEW_DISMISSED); - super.onBackPressed(); - } - /* * follow the tag or url the user typed into the EditText */ diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderUserListActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderUserListActivity.java index e7f47bf31dca..eaf13a0a0171 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderUserListActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderUserListActivity.java @@ -1,7 +1,6 @@ package org.wordpress.android.ui.reader; import android.os.Bundle; -import android.view.View; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -41,12 +40,7 @@ protected void onCreate(Bundle savedInstanceState) { Toolbar toolbar = findViewById(R.id.toolbar_main); if (toolbar != null) { setSupportActionBar(toolbar); - toolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onBackPressed(); - } - }); + toolbar.setNavigationOnClickListener(v -> getOnBackPressedDispatcher().onBackPressed()); } ActionBar actionBar = getSupportActionBar(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/SubfilterBottomSheetFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/SubfilterBottomSheetFragment.kt index d183bf67fa3f..438701ca1492 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/SubfilterBottomSheetFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/SubfilterBottomSheetFragment.kt @@ -24,6 +24,7 @@ import org.wordpress.android.ui.reader.subfilter.SubfilterCategory.SITES import org.wordpress.android.ui.reader.subfilter.SubfilterCategory.TAGS import org.wordpress.android.ui.reader.subfilter.SubfilterListItem.Tag import org.wordpress.android.ui.reader.subfilter.SubfilterPagerAdapter +import org.wordpress.android.util.extensions.getParcelableArrayListCompat import javax.inject.Inject class SubfilterBottomSheetFragment : BottomSheetDialogFragment() { @@ -66,11 +67,14 @@ class SubfilterBottomSheetFragment : BottomSheetDialogFragment() { val subfilterVmKey = requireArguments().getString(SUBFILTER_VIEW_MODEL_KEY)!! val bottomSheetTitle = requireArguments().getCharSequence(SUBFILTER_TITLE_KEY)!! - val categories: ArrayList = requireArguments() - .getParcelableArrayList(SUBFILTER_CATEGORIES_KEY)!! + val categories = requireNotNull( + requireArguments().getParcelableArrayListCompat(SUBFILTER_CATEGORIES_KEY) + ) - viewModel = ViewModelProvider(parentFragment as ViewModelStoreOwner, viewModelFactory) - .get(subfilterVmKey, SubFilterViewModel::class.java) + viewModel = ViewModelProvider( + parentFragment as ViewModelStoreOwner, + viewModelFactory + )[subfilterVmKey, SubFilterViewModel::class.java] val pager = view.findViewById(R.id.view_pager) val tabLayout = view.findViewById(R.id.tab_layout) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsActivity.kt index 5aad63751ee0..3f082043b856 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsActivity.kt @@ -23,7 +23,7 @@ class ReaderInterestsActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt index 9679ce2f978d..29415dce9f88 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt @@ -17,6 +17,7 @@ import org.wordpress.android.ui.reader.discover.interests.ReaderInterestsViewMod import org.wordpress.android.ui.reader.viewmodels.ReaderViewModel import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.LocaleManager +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.viewmodel.observeEvent import org.wordpress.android.widgets.WPSnackbar import javax.inject.Inject @@ -37,7 +38,7 @@ class ReaderInterestsFragment : Fragment(R.layout.reader_interests_fragment_layo override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val entryPoint = requireActivity().intent.getSerializableExtra(READER_INTEREST_ENTRY_POINT) as? EntryPoint + val entryPoint = requireActivity().intent.getSerializableExtraCompat(READER_INTEREST_ENTRY_POINT) ?: EntryPoint.DISCOVER with(ReaderInterestsFragmentLayoutBinding.bind(view)) { initDoneButton() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt index 8507fbf875b1..0ad4b9ad5c32 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/viewholders/ReaderInterestsCardViewHolder.kt @@ -58,14 +58,14 @@ class ReaderInterestsCardViewHolder( * We need to do this immediately, because if we don't, then the next move event could potentially * trigger the viewPager to switch tabs */ - override fun onDown(e: MotionEvent?): Boolean = with(binding) { + override fun onDown(e: MotionEvent): Boolean = with(binding) { interestsList.parent.requestDisallowInterceptTouchEvent(true) return super.onDown(e) } override fun onScroll( - e1: MotionEvent?, - e2: MotionEvent?, + e1: MotionEvent, + e2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean = with(binding) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverJobService.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverJobService.kt index 64bc0036f843..8513c880565d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverJobService.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverJobService.kt @@ -37,7 +37,7 @@ class ReaderDiscoverJobService : JobService(), ServiceCompletionListener, Corout override fun onStartJob(params: JobParameters): Boolean { AppLog.i(READER, "reader discover job service > started") - val task = DiscoverTasks.values()[(params.extras[ReaderDiscoverServiceStarter.ARG_DISCOVER_TASK] as Int)] + val task = DiscoverTasks.values()[params.extras.getInt(ReaderDiscoverServiceStarter.ARG_DISCOVER_TASK)] readerDiscoverLogic.performTasks(task, params, this, this) return true diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverService.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverService.kt index 05853601af7d..6b1dfe14eb0f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverService.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverService.kt @@ -14,6 +14,7 @@ import org.wordpress.android.ui.reader.services.discover.ReaderDiscoverServiceSt import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.READER import org.wordpress.android.util.LocaleManager +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject import javax.inject.Named import kotlin.coroutines.CoroutineContext @@ -56,7 +57,7 @@ class ReaderDiscoverService : Service(), ServiceCompletionListener, CoroutineSco override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { if (intent != null && intent.hasExtra(ARG_DISCOVER_TASK)) { - val task = intent.getSerializableExtra(ARG_DISCOVER_TASK) as DiscoverTasks + val task = requireNotNull(intent.getSerializableExtraCompat(ARG_DISCOVER_TASK)) readerDiscoverLogic.performTasks(task, null, this, this) } return START_NOT_STICKY diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt index 5059cf202a3f..17eadd6a39bd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt @@ -16,7 +16,6 @@ import androidx.annotation.StringRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner import androidx.recyclerview.widget.LinearLayoutManager @@ -35,6 +34,7 @@ import org.wordpress.android.ui.reader.viewmodels.SubfilterPageViewModel import org.wordpress.android.ui.stats.refresh.utils.StatsUtils import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.config.SeenUnseenWithCounterFeatureConfig +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.widgets.WPTextView import java.lang.ref.WeakReference import javax.inject.Inject @@ -80,10 +80,10 @@ class SubfilterPageFragment : DaggerFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val category = requireArguments().getSerializable(CATEGORY_KEY) as SubfilterCategory + val category = requireNotNull(arguments?.getSerializableCompat(CATEGORY_KEY)) val subfilterVmKey = requireArguments().getString(SUBFILTER_VIEW_MODEL_KEY)!! - viewModel = ViewModelProvider(this, viewModelFactory).get(SubfilterPageViewModel::class.java) + viewModel = ViewModelProvider(this, viewModelFactory)[SubfilterPageViewModel::class.java] viewModel.start(category) recyclerView = view.findViewById(R.id.content_recycler_view) @@ -99,7 +99,7 @@ class SubfilterPageFragment : DaggerFragment() { viewModelFactory ).get(subfilterVmKey, SubFilterViewModel::class.java) - subFilterViewModel.subFilters.observe(viewLifecycleOwner, Observer { + subFilterViewModel.subFilters.observe(viewLifecycleOwner) { (recyclerView.adapter as? SubfilterListAdapter)?.let { adapter -> var items = it?.filter { it.type == category.type } ?: listOf() @@ -116,9 +116,9 @@ class SubfilterPageFragment : DaggerFragment() { adapter.update(items) subFilterViewModel.onSubfilterPageUpdated(category, items.size) } - }) + } - viewModel.emptyState.observe(viewLifecycleOwner, Observer { uiState -> + viewModel.emptyState.observe(viewLifecycleOwner) { uiState -> if (isAdded) { when (uiState) { HiddenEmptyUiState -> emptyStateContainer.visibility = View.GONE @@ -132,7 +132,7 @@ class SubfilterPageFragment : DaggerFragment() { } } } - }) + } } fun setNestedScrollBehavior(enable: Boolean) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationActivity.kt index 5cde5e92fb98..457c07c6ff4f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationActivity.kt @@ -4,9 +4,9 @@ import android.app.Activity import android.content.Intent import android.os.Bundle import android.view.MenuItem +import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import androidx.fragment.app.Fragment -import androidx.lifecycle.Observer import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.cancel import org.wordpress.android.R @@ -53,6 +53,7 @@ import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.ActivityUtils import org.wordpress.android.util.config.SiteNameFeatureConfig import org.wordpress.android.util.extensions.exhaustive +import org.wordpress.android.util.extensions.onBackPressedCompat import org.wordpress.android.util.wizard.WizardNavigationTarget import org.wordpress.android.viewmodel.observeEvent import javax.inject.Inject @@ -79,9 +80,18 @@ class SiteCreationActivity : LocaleAwareActivity(), @Inject internal lateinit var jetpackFeatureRemovalOverlayUtil: JetpackFeatureRemovalOverlayUtil @Inject internal lateinit var activityLauncherWrapper: ActivityLauncherWrapper + private val backPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + mainViewModel.onBackPressed() + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.site_creation_activity) + + onBackPressedDispatcher.addCallback(this, backPressedCallback) + mainViewModel.start(savedInstanceState, getSiteCreationSource()) mainViewModel.preloadThumbnails(this) @@ -96,8 +106,8 @@ class SiteCreationActivity : LocaleAwareActivity(), @Suppress("LongMethod") private fun observeVMState() { mainViewModel.navigationTargetObservable - .observe(this, Observer { target -> target?.let { showStep(target) } }) - mainViewModel.wizardFinishedObservable.observe(this, Observer { createSiteState -> + .observe(this) { target -> target?.let { showStep(target) } } + mainViewModel.wizardFinishedObservable.observe(this) { createSiteState -> createSiteState?.let { val intent = Intent() val (siteCreated, localSiteId, titleTaskComplete) = when (createSiteState) { @@ -110,8 +120,8 @@ class SiteCreationActivity : LocaleAwareActivity(), Triple(true, null, createSiteState.isSiteTitleTaskComplete) } is SiteCreationCompleted -> Triple( - true, createSiteState.localSiteId, - createSiteState.isSiteTitleTaskComplete + true, createSiteState.localSiteId, + createSiteState.isSiteTitleTaskComplete ) } intent.putExtra(SitePickerActivity.KEY_SITE_LOCAL_ID, localSiteId) @@ -119,43 +129,38 @@ class SiteCreationActivity : LocaleAwareActivity(), setResult(if (siteCreated) Activity.RESULT_OK else Activity.RESULT_CANCELED, intent) finish() } - }) - mainViewModel.dialogActionObservable.observe(this, Observer { dialogHolder -> - dialogHolder?.let { - val supportFragmentManager = requireNotNull(supportFragmentManager) { - "FragmentManager can't be null at this point" - } - dialogHolder.show(this, supportFragmentManager, uiHelpers) - } - }) - mainViewModel.exitFlowObservable.observe(this, Observer { + } + mainViewModel.dialogActionObservable.observe(this) { + it?.show(this, supportFragmentManager, uiHelpers) + } + mainViewModel.exitFlowObservable.observe(this) { setResult(Activity.RESULT_CANCELED) finish() - }) - mainViewModel.onBackPressedObservable.observe(this, Observer { + } + mainViewModel.onBackPressedObservable.observe(this) { ActivityUtils.hideKeyboard(this) - super.onBackPressed() - }) - siteCreationIntentsViewModel.onBackButtonPressed.observe(this, Observer { + onBackPressedDispatcher.onBackPressedCompat(backPressedCallback) + } + siteCreationIntentsViewModel.onBackButtonPressed.observe(this) { mainViewModel.onBackPressed() - }) - siteCreationIntentsViewModel.onSkipButtonPressed.observe(this, Observer { + } + siteCreationIntentsViewModel.onSkipButtonPressed.observe(this) { mainViewModel.onSiteIntentSkipped() - }) - siteCreationSiteNameViewModel.onBackButtonPressed.observe(this, Observer { + } + siteCreationSiteNameViewModel.onBackButtonPressed.observe(this) { mainViewModel.onBackPressed() ActivityUtils.hideKeyboard(this) - }) - siteCreationSiteNameViewModel.onSkipButtonPressed.observe(this, Observer { + } + siteCreationSiteNameViewModel.onSkipButtonPressed.observe(this) { ActivityUtils.hideKeyboard(this) mainViewModel.onSiteNameSkipped() - }) - hppViewModel.onBackButtonPressed.observe(this, Observer { + } + hppViewModel.onBackButtonPressed.observe(this) { mainViewModel.onBackPressed() - }) - hppViewModel.onDesignActionPressed.observe(this, Observer { design -> + } + hppViewModel.onDesignActionPressed.observe(this) { design -> mainViewModel.onSiteDesignSelected(design.template) - }) + } observeOverlayEvents() } @@ -274,16 +279,12 @@ class SiteCreationActivity : LocaleAwareActivity(), override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return false } - override fun onBackPressed() { - mainViewModel.onBackPressed() - } - companion object { const val ARG_CREATE_SITE_SOURCE = "ARG_CREATE_SITE_SOURCE" } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVM.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVM.kt index 26a0d4ea9fa5..6190a3fefaff 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVM.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVM.kt @@ -32,6 +32,7 @@ import org.wordpress.android.util.AppLog.T import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.config.SiteCreationDomainPurchasingFeatureConfig import org.wordpress.android.util.experiments.SiteCreationDomainPurchasingExperiment +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.wizard.WizardManager import org.wordpress.android.util.wizard.WizardNavigationTarget @@ -128,7 +129,7 @@ class SiteCreationMainVM @Inject constructor( showSiteCreationNextStep() } else { siteCreationCompleted = savedInstanceState.getBoolean(KEY_SITE_CREATION_COMPLETED, false) - siteCreationState = requireNotNull(savedInstanceState.getParcelable(KEY_SITE_CREATION_STATE)) + siteCreationState = requireNotNull(savedInstanceState.getParcelableCompat(KEY_SITE_CREATION_STATE)) val currentStepIndex = savedInstanceState.getInt(KEY_CURRENT_STEP) wizardManager.setCurrentStepIndex(currentStepIndex) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SiteCreationPreviewFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SiteCreationPreviewFragment.kt index 24c002fdb551..785da3cb29d9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SiteCreationPreviewFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SiteCreationPreviewFragment.kt @@ -41,6 +41,7 @@ import org.wordpress.android.util.AppLog import org.wordpress.android.util.AutoForeground.ServiceEventConnection import org.wordpress.android.util.ErrorManagedWebViewClient.ErrorManagedWebViewClientListener import org.wordpress.android.util.URLFilteredWebViewClient +import org.wordpress.android.util.extensions.getParcelableCompat import javax.inject.Inject private const val ARG_DATA = "arg_site_creation_data" @@ -97,7 +98,7 @@ class SiteCreationPreviewFragment : SiteCreationBaseFormFragment(), super.onViewCreated(view, savedInstanceState) (requireActivity() as AppCompatActivity).supportActionBar?.hide() - viewModel.start(requireArguments()[ARG_DATA] as SiteCreationState, savedInstanceState) + viewModel.start(requireNotNull(arguments?.getParcelableCompat(ARG_DATA)), savedInstanceState) } override fun getContentLayout(): Int { @@ -268,7 +269,7 @@ class SiteCreationPreviewFragment : SiteCreationBaseFormFragment(), progressText.text = newText } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) animatorSet = null } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModel.kt index e78740aa5e8b..ccd6a2370f21 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModel.kt @@ -49,6 +49,7 @@ import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.UrlUtilsWrapper +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.viewmodel.SingleLiveEvent import javax.inject.Inject import javax.inject.Named @@ -137,7 +138,7 @@ class SitePreviewViewModel @Inject constructor( urlWithoutScheme = siteCreationState.domain siteTitle = siteCreationState.siteName - val restoredState = savedState?.getParcelable(KEY_CREATE_SITE_STATE) + val restoredState = savedState?.getParcelableCompat(KEY_CREATE_SITE_STATE) init(restoredState ?: SiteNotCreated) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/services/SiteCreationService.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/services/SiteCreationService.kt index 958c79f64157..3e6556dc90d0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/services/SiteCreationService.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/services/SiteCreationService.kt @@ -17,6 +17,7 @@ import org.wordpress.android.util.AppLog.T import org.wordpress.android.util.AutoForeground import org.wordpress.android.util.LocaleManager import org.wordpress.android.util.LocaleManagerWrapper +import org.wordpress.android.util.extensions.getParcelableExtraCompat import javax.inject.Inject private val INITIAL_STATE = IDLE @@ -47,7 +48,7 @@ class SiteCreationService : AutoForeground(SiteCreatio return Service.START_NOT_STICKY } - val data = intent.getParcelableExtra(ARG_DATA)!! + val data = requireNotNull(intent.getParcelableExtraCompat(ARG_DATA)) manager.onStart( LocaleManager.getLanguageWordPressId(this), localeManagerWrapper.getTimeZone().id, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsConnectJetpackActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsConnectJetpackActivity.kt index 4a41baa16a05..e63d0018f31a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsConnectJetpackActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsConnectJetpackActivity.kt @@ -22,6 +22,7 @@ import org.wordpress.android.ui.WPWebViewActivity import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.API import org.wordpress.android.util.WPUrlUtils +import org.wordpress.android.util.extensions.getSerializableExtraCompat import javax.inject.Inject /** @@ -72,14 +73,18 @@ class StatsConnectJetpackActivity : LocaleAwareActivity() { if (TextUtils.isEmpty(mAccountStore.account.userName)) { mDispatcher.dispatch(AccountActionBuilder.newFetchAccountAction()) } else { - startJetpackConnectionFlow(intent.getSerializableExtra(WordPress.SITE) as SiteModel) + startJetpackConnectionFlow( + requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) + ) } } } private fun StatsJetpackConnectionActivityBinding.initViews() { jetpackSetup.setOnClickListener { - startJetpackConnectionFlow(intent.getSerializableExtra(WordPress.SITE) as SiteModel) + startJetpackConnectionFlow( + requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) + ) } jetpackFaq.setOnClickListener { WPWebViewActivity.openURL(this@StatsConnectJetpackActivity, FAQ_URL) @@ -133,7 +138,7 @@ class StatsConnectJetpackActivity : LocaleAwareActivity() { event.causeOfChange == FETCH_ACCOUNT && !TextUtils.isEmpty(mAccountStore.account.userName) ) { - startJetpackConnectionFlow(intent.getSerializableExtra(WordPress.SITE) as SiteModel) + startJetpackConnectionFlow(requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE))) } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsActivity.kt index 25ab3eaed2ee..80385f36a3c8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsActivity.kt @@ -34,7 +34,7 @@ class StatsActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllActivity.kt index ee070223d926..fb82be62354e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllActivity.kt @@ -23,7 +23,7 @@ class StatsViewAllActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt index 016d5fe6d934..75113bc59a81 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt @@ -34,6 +34,10 @@ import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider import org.wordpress.android.ui.stats.refresh.utils.drawDateSelector import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.WPSwipeToRefreshHelper +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getParcelableExtraCompat +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.helpers.SwipeToRefreshHelper import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent @@ -78,13 +82,13 @@ class StatsViewAllFragment : DaggerFragment(R.layout.stats_view_all_fragment) { if (intent.hasExtra(ARGS_VIEW_TYPE)) { outState.putSerializable( ARGS_VIEW_TYPE, - intent.getSerializableExtra(ARGS_VIEW_TYPE) + intent.getSerializableExtraCompat(ARGS_VIEW_TYPE) ) } if (intent.hasExtra(ARGS_TIMEFRAME)) { outState.putSerializable( ARGS_TIMEFRAME, - intent.getSerializableExtra(ARGS_TIMEFRAME) + intent.getSerializableExtraCompat(ARGS_TIMEFRAME) ) } outState.putInt(WordPress.LOCAL_SITE_ID, intent.getIntExtra(WordPress.LOCAL_SITE_ID, 0)) @@ -96,7 +100,7 @@ class StatsViewAllFragment : DaggerFragment(R.layout.stats_view_all_fragment) { private fun StatsViewAllFragmentBinding.initializeViews(savedInstanceState: Bundle?) { val layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false) - savedInstanceState?.getParcelable(listStateKey)?.let { + savedInstanceState?.getParcelableCompat(listStateKey)?.let { layoutManager.onRestoreInstanceState(it) } with(statsListFragment) { @@ -153,16 +157,18 @@ class StatsViewAllFragment : DaggerFragment(R.layout.stats_view_all_fragment) { savedInstanceState: Bundle? ) { val nonNullIntent = checkNotNull(activity.intent) - val type = if (savedInstanceState == null) { - nonNullIntent.getSerializableExtra(ARGS_VIEW_TYPE) as StatsViewType - } else { - savedInstanceState.getSerializable(ARGS_VIEW_TYPE) as StatsViewType - } + val type = requireNotNull( + if (savedInstanceState == null) { + nonNullIntent.getSerializableExtraCompat(ARGS_VIEW_TYPE) + } else { + savedInstanceState.getSerializableCompat(ARGS_VIEW_TYPE) + } + ) - val granularity = if (savedInstanceState == null) { - nonNullIntent.getSerializableExtra(ARGS_TIMEFRAME) as StatsGranularity? + val granularity: StatsGranularity? = if (savedInstanceState == null) { + nonNullIntent.getSerializableExtraCompat(ARGS_TIMEFRAME) } else { - savedInstanceState.getSerializable(ARGS_TIMEFRAME) as StatsGranularity? + savedInstanceState.getSerializableCompat(ARGS_TIMEFRAME) } val siteId = savedInstanceState?.getInt(WordPress.LOCAL_SITE_ID, 0) @@ -172,10 +178,10 @@ class StatsViewAllFragment : DaggerFragment(R.layout.stats_view_all_fragment) { val viewModelFactory = viewModelFactoryBuilder.build(type, granularity) viewModel = ViewModelProvider(activity, viewModelFactory).get(StatsViewAllViewModel::class.java) - val selectedDate = if (savedInstanceState == null) { - nonNullIntent.getParcelableExtra(ARGS_SELECTED_DATE) as SelectedDate? + val selectedDate: SelectedDate? = if (savedInstanceState == null) { + nonNullIntent.getParcelableExtraCompat(ARGS_SELECTED_DATE) } else { - savedInstanceState.getParcelable(ARGS_SELECTED_DATE) as SelectedDate? + savedInstanceState.getParcelableCompat(ARGS_SELECTED_DATE) } setupObservers(activity) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewModel.kt index fb785a27f043..9ebc14e5b248 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewModel.kt @@ -53,6 +53,7 @@ import org.wordpress.android.util.JetpackBrandingUtils import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper import org.wordpress.android.util.config.MySiteDashboardTodaysStatsCardFeatureConfig +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.mapNullable import org.wordpress.android.util.mergeNotNull import org.wordpress.android.viewmodel.Event @@ -114,10 +115,10 @@ class StatsViewModel fun start(intent: Intent, restart: Boolean = false) { val localSiteId = intent.getIntExtra(WordPress.LOCAL_SITE_ID, 0) - val launchedFrom = intent.getSerializableExtra(StatsActivity.ARG_LAUNCHED_FROM) + val launchedFrom = intent.getSerializableExtraCompat(StatsActivity.ARG_LAUNCHED_FROM) val initialTimeFrame = getInitialTimeFrame(intent) val initialSelectedPeriod = intent.getStringExtra(StatsActivity.INITIAL_SELECTED_PERIOD_KEY) - val notificationType = intent.getSerializableExtra(ARG_NOTIFICATION_TYPE) as? NotificationType + val notificationType = intent.getSerializableExtraCompat(ARG_NOTIFICATION_TYPE) start(localSiteId, launchedFrom, initialTimeFrame, initialSelectedPeriod, restart, notificationType) } @@ -135,7 +136,7 @@ class StatsViewModel } private fun getInitialTimeFrame(intent: Intent): StatsSection? { - return when (intent.getSerializableExtra(StatsActivity.ARG_DESIRED_TIMEFRAME)) { + return when (intent.getSerializableExtraCompat(StatsActivity.ARG_DESIRED_TIMEFRAME)) { StatsTimeframe.INSIGHTS -> StatsSection.INSIGHTS DAY -> StatsSection.DAYS WEEK -> StatsSection.WEEKS diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt index 5cec079d6b34..37d05e639033 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt @@ -27,6 +27,9 @@ import org.wordpress.android.ui.stats.refresh.lists.detail.DetailListViewModel import org.wordpress.android.ui.stats.refresh.utils.StatsDateFormatter import org.wordpress.android.ui.stats.refresh.utils.StatsNavigator import org.wordpress.android.ui.stats.refresh.utils.drawDateSelector +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.extensions.setVisible import org.wordpress.android.util.image.ImageManager import org.wordpress.android.viewmodel.observeEvent @@ -68,8 +71,8 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - statsSection = arguments?.getSerializable(LIST_TYPE) as? StatsSection - ?: activity?.intent?.getSerializableExtra(LIST_TYPE) as? StatsSection + statsSection = arguments?.getSerializableCompat(LIST_TYPE) + ?: activity?.intent?.getSerializableExtraCompat(LIST_TYPE) ?: StatsSection.INSIGHTS setHasOptionsMenu(statsSection == StatsSection.INSIGHTS) @@ -80,7 +83,7 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { layoutManager?.let { outState.putParcelable(listStateKey, it.onSaveInstanceState()) } - (activity?.intent?.getSerializableExtra(LIST_TYPE) as? StatsSection)?.let { sectionFromIntent -> + (activity?.intent?.getSerializableExtraCompat(LIST_TYPE))?.let { sectionFromIntent -> outState.putSerializable(LIST_TYPE, sectionFromIntent) } super.onSaveInstanceState(outState) @@ -110,7 +113,7 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { } else { StaggeredGridLayoutManager(columns, StaggeredGridLayoutManager.VERTICAL) } - savedInstanceState?.getParcelable(listStateKey)?.let { + savedInstanceState?.getParcelableCompat(listStateKey)?.let { layoutManager.onRestoreInstanceState(it) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/InsightsDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/InsightsDetailFragment.kt index 6a360420730e..45f709eef9d6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/InsightsDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/InsightsDetailFragment.kt @@ -13,7 +13,9 @@ import org.wordpress.android.databinding.StatsDetailFragmentBinding import org.wordpress.android.ui.stats.refresh.lists.StatsListFragment import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection import org.wordpress.android.util.WPSwipeToRefreshHelper +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.helpers.SwipeToRefreshHelper +import java.io.Serializable @AndroidEntryPoint class InsightsDetailFragment : Fragment(R.layout.stats_detail_fragment) { @@ -29,7 +31,9 @@ class InsightsDetailFragment : Fragment(R.layout.stats_detail_fragment) { super.onViewCreated(view, savedInstanceState) val nonNullActivity = requireActivity() - val listType = nonNullActivity.intent.extras?.get(StatsListFragment.LIST_TYPE) as StatsSection + val listType = requireNotNull( + nonNullActivity.intent.extras?.getSerializableCompat(StatsListFragment.LIST_TYPE) + ) with(StatsDetailFragmentBinding.bind(view)) { with(nonNullActivity as AppCompatActivity) { setSupportActionBar(toolbar) @@ -52,7 +56,7 @@ class InsightsDetailFragment : Fragment(R.layout.stats_detail_fragment) { private fun initializeViewModels(activity: FragmentActivity) { val siteId = activity.intent?.getIntExtra(WordPress.LOCAL_SITE_ID, 0) ?: 0 - val listType = activity.intent.extras?.get(StatsListFragment.LIST_TYPE) + val listType = activity.intent.extras?.getSerializableCompat(StatsListFragment.LIST_TYPE) viewModel = when (listType) { StatsSection.INSIGHT_DETAIL -> viewsVisitorsDetailViewModel diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailActivity.kt index 6dbacf1e9eeb..0391ba1e0474 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailActivity.kt @@ -20,6 +20,8 @@ import org.wordpress.android.ui.stats.refresh.lists.StatsListFragment import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection import org.wordpress.android.ui.stats.refresh.lists.sections.granular.SelectedDateProvider.SelectedDate import org.wordpress.android.util.analytics.AnalyticsUtils +import org.wordpress.android.util.extensions.getSerializableCompat +import java.io.Serializable const val POST_ID = "POST_ID" const val POST_TYPE = "POST_TYPE" @@ -33,7 +35,7 @@ class StatsDetailActivity : LocaleAwareActivity() { val binding = StatsDetailActivityBinding.inflate(layoutInflater) setContentView(binding.root) - val listType = intent.extras?.get(StatsListFragment.LIST_TYPE) + val listType = intent.extras?.getSerializableCompat(StatsListFragment.LIST_TYPE) if (savedInstanceState == null) { supportFragmentManager.commit { @@ -51,7 +53,7 @@ class StatsDetailActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailFragment.kt index 28995aa27790..abd848737dbd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/detail/StatsDetailFragment.kt @@ -94,9 +94,9 @@ class StatsDetailFragment : DaggerFragment(R.layout.stats_detail_fragment) { statsSiteProvider.start(siteId) val postId = activity.intent?.getLongExtra(POST_ID, 0L) - val postType = activity.intent?.getSerializableExtra(POST_TYPE) as String? - val postTitle = activity.intent?.getSerializableExtra(POST_TITLE) as String? - val postUrl = activity.intent?.getSerializableExtra(POST_URL) as String? + val postType = activity.intent?.getStringExtra(POST_TYPE) + val postTitle = activity.intent?.getStringExtra(POST_TITLE) + val postUrl = activity.intent?.getStringExtra(POST_URL) viewModel = ViewModelProvider(this, viewModelFactory) .get(StatsSection.DETAIL.name, StatsDetailViewModel::class.java) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt index f77b236a5ce8..6cc52b2e5572 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt @@ -20,6 +20,8 @@ import org.wordpress.android.ui.stats.refresh.utils.StatsDateFormatter import org.wordpress.android.ui.stats.refresh.utils.toStatsSection import org.wordpress.android.ui.stats.refresh.utils.trackWithSection import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper +import org.wordpress.android.util.extensions.readListCompat +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.filter import java.util.Date import javax.inject.Inject @@ -172,7 +174,7 @@ class SelectedDateProvider fun onRestoreInstanceState(savedState: Bundle) { for (period in listOf(DAYS, WEEKS, MONTHS, YEARS)) { - val selectedDate: SelectedDate? = savedState.getParcelable(buildStateKey(period)) as SelectedDate? + val selectedDate = savedState.getParcelableCompat(buildStateKey(period)) if (selectedDate != null) { mutableDates[period] = selectedDate } @@ -223,7 +225,7 @@ class SelectedDateProvider null } val availableTimeStamps = mutableListOf() - parcel.readList(availableTimeStamps, null) + parcel.readListCompat(availableTimeStamps, null) val availableDates = availableTimeStamps.map { Date(it as Long) } val loading = parcel.readValue(null) as Boolean val error = parcel.readValue(null) as Boolean diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementActivity.kt index fbb3d52ec2a1..3842d273eed2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementActivity.kt @@ -24,7 +24,7 @@ class InsightsManagementActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementFragment.kt index 100a95759b20..7b4f060d2345 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementFragment.kt @@ -5,7 +5,7 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.core.view.MenuProvider import androidx.fragment.app.FragmentActivity import androidx.lifecycle.ViewModelProvider @@ -33,11 +33,7 @@ class InsightsManagementFragment : DaggerFragment(R.layout.insights_management_f initializeViews() initializeViewModels(requireActivity(), siteId) } - activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - viewModel.onBackPressed() - } - }) + requireActivity().onBackPressedDispatcher.addCallback(this) { viewModel.onBackPressed() } } override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/alltime/StatsAllTimeWidgetConfigureActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/alltime/StatsAllTimeWidgetConfigureActivity.kt index 2d8364d7ce9a..0c888fe3013d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/alltime/StatsAllTimeWidgetConfigureActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/alltime/StatsAllTimeWidgetConfigureActivity.kt @@ -21,7 +21,7 @@ class StatsAllTimeWidgetConfigureActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/minified/StatsMinifiedWidgetConfigureActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/minified/StatsMinifiedWidgetConfigureActivity.kt index 4402a1769655..7ef15a5ff49f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/minified/StatsMinifiedWidgetConfigureActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/minified/StatsMinifiedWidgetConfigureActivity.kt @@ -21,7 +21,7 @@ class StatsMinifiedWidgetConfigureActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/today/StatsTodayWidgetConfigureActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/today/StatsTodayWidgetConfigureActivity.kt index 6f8cadff4fb2..2097a7472246 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/today/StatsTodayWidgetConfigureActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/today/StatsTodayWidgetConfigureActivity.kt @@ -21,7 +21,7 @@ class StatsTodayWidgetConfigureActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/views/StatsViewsWidgetConfigureActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/views/StatsViewsWidgetConfigureActivity.kt index 057ea12aaa37..321d789fe963 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/views/StatsViewsWidgetConfigureActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/views/StatsViewsWidgetConfigureActivity.kt @@ -21,7 +21,7 @@ class StatsViewsWidgetConfigureActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/weeks/StatsWeekWidgetConfigureActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/weeks/StatsWeekWidgetConfigureActivity.kt index f6fe3e596baa..d6e0b0236b75 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/weeks/StatsWeekWidgetConfigureActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/weeks/StatsWeekWidgetConfigureActivity.kt @@ -21,7 +21,7 @@ class StatsWeekWidgetConfigureActivity : LocaleAwareActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } return super.onOptionsItemSelected(item) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesMediaPickerResultHandler.kt b/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesMediaPickerResultHandler.kt index 1c8d265a4170..fd6b57d8626b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesMediaPickerResultHandler.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesMediaPickerResultHandler.kt @@ -16,6 +16,7 @@ import org.wordpress.android.ui.mysite.SiteNavigationAction.AddNewStoryWithMedia import org.wordpress.android.ui.photopicker.MediaPickerConstants import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.UTILS +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.viewmodel.Event import javax.inject.Inject @@ -109,8 +110,10 @@ class StoriesMediaPickerResultHandler private fun isWPStoriesMediaBrowserTypeResult(data: Intent): Boolean { if (data.hasExtra(MediaBrowserActivity.ARG_BROWSER_TYPE)) { - val browserType = data.getSerializableExtra(MediaBrowserActivity.ARG_BROWSER_TYPE) - return (browserType as MediaBrowserType).isWPStoriesPicker + val browserType = requireNotNull( + data.getSerializableExtraCompat(MediaBrowserActivity.ARG_BROWSER_TYPE) + ) + return browserType.isWPStoriesPicker } return false } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesTrackerHelper.kt b/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesTrackerHelper.kt index a71e8bae6a26..76771fed8ad1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesTrackerHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stories/StoriesTrackerHelper.kt @@ -6,6 +6,7 @@ import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.analytics.AnalyticsTracker.Stat import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.util.analytics.AnalyticsUtils +import org.wordpress.android.util.extensions.getSerializableCompat import javax.inject.Inject class StoriesTrackerHelper @Inject constructor() { @@ -33,7 +34,7 @@ class StoriesTrackerHelper @Inject constructor() { val properties = getCommonProperties(event) var siteModel: SiteModel? = null event.metadata?.let { - siteModel = it.getSerializable(WordPress.SITE) as SiteModel + siteModel = it.getSerializableCompat(WordPress.SITE) } siteModel?.let { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stories/StoryComposerActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/stories/StoryComposerActivity.kt index 6e377a93d654..e4105c4014e2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stories/StoryComposerActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stories/StoryComposerActivity.kt @@ -86,6 +86,10 @@ import org.wordpress.android.util.WPMediaUtils import org.wordpress.android.util.WPPermissionUtils import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper +import org.wordpress.android.util.extensions.getParcelableCompat +import org.wordpress.android.util.extensions.getParcelableExtraCompat +import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.getSerializableExtraCompat import org.wordpress.android.util.helpers.MediaFile import org.wordpress.android.viewmodel.observeEvent import org.wordpress.android.widgets.WPSnackbar @@ -197,10 +201,10 @@ class StoryComposerActivity : ComposeLoopFrameActivity(), } private fun initSite(savedInstanceState: Bundle?) { - if (savedInstanceState == null) { - site = intent.getSerializableExtra(WordPress.SITE) as SiteModel + site = if (savedInstanceState == null) { + intent.getSerializableExtraCompat(WordPress.SITE) } else { - site = savedInstanceState.getSerializable(WordPress.SITE) as SiteModel + savedInstanceState.getSerializableCompat(WordPress.SITE) } } @@ -211,10 +215,10 @@ class StoryComposerActivity : ComposeLoopFrameActivity(), if (savedInstanceState == null) { localPostId = getBackingPostIdFromIntent() - originalStorySaveResult = intent.getParcelableExtra(KEY_STORY_SAVE_RESULT) as StorySaveResult? + originalStorySaveResult = intent.getParcelableExtraCompat(KEY_STORY_SAVE_RESULT) if (intent.hasExtra(ARG_NOTIFICATION_TYPE)) { - notificationType = intent.getSerializableExtra(ARG_NOTIFICATION_TYPE) as NotificationType + notificationType = intent.getSerializableExtraCompat(ARG_NOTIFICATION_TYPE) } } else { if (savedInstanceState.containsKey(STATE_KEY_POST_LOCAL_ID)) { @@ -222,7 +226,7 @@ class StoryComposerActivity : ComposeLoopFrameActivity(), } if (savedInstanceState.containsKey(STATE_KEY_ORIGINAL_STORY_SAVE_RESULT)) { originalStorySaveResult = - savedInstanceState.getParcelable(STATE_KEY_ORIGINAL_STORY_SAVE_RESULT) as StorySaveResult? + savedInstanceState.getParcelableCompat(STATE_KEY_ORIGINAL_STORY_SAVE_RESULT) } } @@ -230,8 +234,7 @@ class StoryComposerActivity : ComposeLoopFrameActivity(), PostEditorAnalyticsSession.fromBundle(bundle, STATE_KEY_EDITOR_SESSION_DATA, analyticsTrackerWrapper) } - viewModel = ViewModelProvider(this, viewModelFactory) - .get(StoryComposerViewModel::class.java) + viewModel = ViewModelProvider(this, viewModelFactory)[StoryComposerViewModel::class.java] site?.let { val postInitialized = viewModel.start( @@ -370,8 +373,7 @@ class StoryComposerActivity : ComposeLoopFrameActivity(), var localPostId = intent.getIntExtra(KEY_POST_LOCAL_ID, 0) if (localPostId == 0) { if (intent.hasExtra(KEY_STORY_SAVE_RESULT)) { - val storySaveResult = - intent.getParcelableExtra(KEY_STORY_SAVE_RESULT) as StorySaveResult? + val storySaveResult = intent.getParcelableExtraCompat(KEY_STORY_SAVE_RESULT) storySaveResult?.let { localPostId = it.metadata?.getInt(KEY_POST_LOCAL_ID, 0) ?: 0 } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stories/intro/StoriesIntroDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stories/intro/StoriesIntroDialogFragment.kt index e33508182de2..9067133bfc45 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stories/intro/StoriesIntroDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stories/intro/StoriesIntroDialogFragment.kt @@ -7,7 +7,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.DialogFragment -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import org.wordpress.android.R import org.wordpress.android.WordPress @@ -15,6 +14,7 @@ import org.wordpress.android.databinding.StoriesIntroDialogFragmentBinding import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.ui.ActivityLauncher import org.wordpress.android.ui.photopicker.MediaPickerLauncher +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.extensions.setStatusBarAsSurfaceColor import javax.inject.Inject @@ -59,7 +59,7 @@ class StoriesIntroDialogFragment : DialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val site = requireArguments().getSerializable(WordPress.SITE) as SiteModel + val site = requireArguments().getSerializableCompat(WordPress.SITE) with(StoriesIntroDialogFragmentBinding.bind(view)) { createStoryIntroButton.setOnClickListener { viewModel.onCreateStoryButtonPressed() } storiesIntroBackButton.setOnClickListener { viewModel.onBackButtonPressed() } @@ -67,20 +67,20 @@ class StoriesIntroDialogFragment : DialogFragment() { storyImageFirst.setOnClickListener { viewModel.onStoryPreviewTapped1() } storyImageSecond.setOnClickListener { viewModel.onStoryPreviewTapped2() } } - viewModel.onCreateButtonClicked.observe(this, Observer { + viewModel.onCreateButtonClicked.observe(this) { activity?.let { mediaPickerLauncher.showStoriesPhotoPickerForResultAndTrack(it, site) } dismiss() - }) + } - viewModel.onDialogClosed.observe(this, Observer { + viewModel.onDialogClosed.observe(this) { dismiss() - }) + } - viewModel.onStoryOpenRequested.observe(this, Observer { storyUrl -> + viewModel.onStoryOpenRequested.observe(this) { storyUrl -> ActivityLauncher.openUrlExternal(context, storyUrl) - }) + } viewModel.start() } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stories/media/StoryMediaSaveUploadBridge.kt b/WordPress/src/main/java/org/wordpress/android/ui/stories/media/StoryMediaSaveUploadBridge.kt index 72c008aaddc4..5fa9fa173fd8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stories/media/StoryMediaSaveUploadBridge.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stories/media/StoryMediaSaveUploadBridge.kt @@ -36,6 +36,7 @@ import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.ToastUtils.Duration.LONG +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.util.helpers.MediaFile import javax.inject.Inject import javax.inject.Named @@ -239,7 +240,7 @@ class StoryMediaSaveUploadBridge @Inject constructor( storiesTrackerHelper.trackStorySaveResultEvent(event) event.metadata?.let { - val site = it.getSerializable(WordPress.SITE) as SiteModel + val site = requireNotNull(it.getSerializableCompat(WordPress.SITE)) val story = storyRepositoryWrapper.getStoryAtIndex(event.storyIndex) saveStoryGutenbergBlockUseCase.saveNewLocalFilesToStoriesPrefsTempSlides( site, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/suggestion/SuggestionActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/SuggestionActivity.kt index b39947890415..9e160c569cdb 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/suggestion/SuggestionActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/SuggestionActivity.kt @@ -9,6 +9,7 @@ import android.text.Editable import android.text.TextWatcher import android.view.KeyEvent import android.view.inputmethod.EditorInfo +import androidx.activity.addCallback import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.wordpress.android.R @@ -23,6 +24,8 @@ import org.wordpress.android.ui.suggestion.adapters.SuggestionAdapter import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T import org.wordpress.android.util.ToastUtils +import org.wordpress.android.util.extensions.getSerializableExtraCompat +import org.wordpress.android.util.extensions.onBackPressedCompat import org.wordpress.android.widgets.SuggestionAutoCompleteText import javax.inject.Inject @@ -42,8 +45,13 @@ class SuggestionActivity : LocaleAwareActivity() { binding = this } - val siteModel = intent.getSerializableExtra(INTENT_KEY_SITE_MODEL) as? SiteModel - val suggestionType = intent.getSerializableExtra(INTENT_KEY_SUGGESTION_TYPE) as? SuggestionType + onBackPressedDispatcher.addCallback(this) { + viewModel.trackExit(false) + onBackPressedDispatcher.onBackPressedCompat(this) + } + + val siteModel = intent.getSerializableExtraCompat(INTENT_KEY_SITE_MODEL) + val suggestionType = intent.getSerializableExtraCompat(INTENT_KEY_SUGGESTION_TYPE) when { siteModel == null -> abortDueToMissingIntentExtra(INTENT_KEY_SITE_MODEL) suggestionType == null -> abortDueToMissingIntentExtra(INTENT_KEY_SUGGESTION_TYPE) @@ -57,11 +65,6 @@ class SuggestionActivity : LocaleAwareActivity() { finish() } - override fun onBackPressed() { - viewModel.trackExit(false) - super.onBackPressed() - } - private fun initializeActivity(siteModel: SiteModel, suggestionType: SuggestionType) { siteId = siteModel.siteId viewModel.init(suggestionType, siteModel).let { supportsSuggestions -> diff --git a/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeBrowserActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeBrowserActivity.java index 2c6f5026b560..e5429f3a0fba 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeBrowserActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeBrowserActivity.java @@ -8,6 +8,7 @@ import android.view.View.OnScrollChangeListener; import android.widget.TextView; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; @@ -47,6 +48,7 @@ import org.wordpress.android.util.JetpackBrandingUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.analytics.AnalyticsUtils; +import org.wordpress.android.util.extensions.CompatExtensionsKt; import org.wordpress.android.widgets.HeaderGridView; import java.util.HashMap; @@ -93,6 +95,19 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.theme_browser_activity); + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + FragmentManager fm = getSupportFragmentManager(); + if (fm.getBackStackEntryCount() > 0) { + fm.popBackStack(); + } else { + CompatExtensionsKt.onBackPressedCompat(getOnBackPressedDispatcher(), this); + } + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + if (savedInstanceState == null) { addBrowserFragment(); fetchInstalledThemesIfJetpackSite(); @@ -129,23 +144,13 @@ protected void onSaveInstanceState(@NotNull Bundle outState) { public boolean onOptionsItemSelected(MenuItem item) { int i = item.getItemId(); if (i == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); return true; } return super.onOptionsItemSelected(item); } - @Override - public void onBackPressed() { - FragmentManager fm = getSupportFragmentManager(); - if (fm.getBackStackEntryCount() > 0) { - fm.popBackStack(); - } else { - super.onBackPressed(); - } - } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/WordPress/src/main/java/org/wordpress/android/util/PackageManagerWrapper.kt b/WordPress/src/main/java/org/wordpress/android/util/PackageManagerWrapper.kt index b2aceb345ad5..8b5c8f2932c6 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/PackageManagerWrapper.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/PackageManagerWrapper.kt @@ -4,6 +4,7 @@ import android.content.ComponentName import android.content.Intent import android.content.pm.PackageManager import org.wordpress.android.util.AppLog.T +import org.wordpress.android.util.extensions.getActivityInfoCompat import org.wordpress.android.viewmodel.ContextProvider import javax.inject.Inject import javax.inject.Singleton @@ -38,7 +39,7 @@ class PackageManagerWrapper @Inject constructor( intent.component?.let { try { val context = contextProvider.getContext() - val activityInfo = context.packageManager.getActivityInfo(it, PackageManager.GET_META_DATA) + val activityInfo = context.packageManager.getActivityInfoCompat(it, PackageManager.GET_META_DATA) return activityInfo.labelRes } catch (ex: PackageManager.NameNotFoundException) { AppLog.e(T.UTILS, "Unable to extract label res from activity info") diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt new file mode 100644 index 000000000000..cc0cb8349331 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt @@ -0,0 +1,130 @@ +package org.wordpress.android.util.extensions + +import android.content.ComponentName +import android.content.Intent +import android.content.pm.ActivityInfo +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.os.Build +import android.os.Bundle +import android.os.Parcel +import android.os.Parcelable +import androidx.activity.OnBackPressedCallback +import androidx.activity.OnBackPressedDispatcher +import java.io.Serializable + +/** + * This is a temporary workaround for the issue described here: https://issuetracker.google.com/issues/247982487 + * This function temporary disables the callback to allow the system to handle the back pressed event. + * + * TODO: Replace this temporary workaround before enabling predictive back gesture on this project + * (android:enableOnBackInvokedCallback="true"). + * + * Related Issue: https://github.com/wordpress-mobile/WordPress-Android/issues/18053 + */ +@Suppress("ForbiddenComment") +fun OnBackPressedDispatcher.onBackPressedCompat(onBackPressedCallback: OnBackPressedCallback) { + onBackPressedCallback.isEnabled = false + onBackPressed() + onBackPressedCallback.isEnabled = true +} + +/** + * TODO: Remove this when stable androidx.core 1.10 is released. Use IntentCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Intent.getParcelableExtraCompat(key: String): T? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableExtra(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableExtra(key) as T? + } + +/** + * This is an Android 13 compatibility function that is not included in IntentCompat. + */ +inline fun Intent.getSerializableExtraCompat(key: String): T? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getSerializableExtra(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getSerializableExtra(key) as T? + } + +/** + * TODO: Remove this when stable androidx.core 1.10 is released. Use BundleCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Bundle.getParcelableCompat(key: String): T? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelable(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelable(key) + } + +/** + * TODO: Remove this when stable androidx.core 1.10 is released. Use BundleCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Bundle.getParcelableArrayListCompat(key: String): ArrayList? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableArrayList(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableArrayList(key) + } + +/** + * This is an Android 13 compatibility function that is not included in BundleCompat. + */ +inline fun Bundle.getSerializableCompat(key: String): T? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getSerializable(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getSerializable(key) as T? + } + +/** + * TODO: Remove this when upgrading to androidx.core 1.9.0. Use ParcelCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Parcel.readParcelableCompat(loader: ClassLoader?): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + readParcelable(loader, T::class.java) + } else { + @Suppress("DEPRECATION") + readParcelable(loader) + } +} + +/** + * TODO: Remove this when upgrading to androidx.core 1.9.0. Use ParcelCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Parcel.readListCompat(outVal: MutableList, loader: ClassLoader?) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + readList(outVal, loader, T::class.java) + } else { + @Suppress("DEPRECATION") + readList(outVal, loader) + } +} + +fun PackageManager.getActivityInfoCompat(componentName: ComponentName, flags: Int): ActivityInfo = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getActivityInfo(componentName, PackageManager.ComponentInfoFlags.of(flags.toLong())) + } else { + @Suppress("DEPRECATION") + getActivityInfo(componentName, flags) + } + +fun PackageManager.getPackageInfoCompat(packageName: String, flags: Int): PackageInfo? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flags.toLong())) + } else { + @Suppress("DEPRECATION") + getPackageInfo(packageName, flags) + } diff --git a/WordPress/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt b/WordPress/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt index a996ccbca90a..abaa20bce5d7 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt @@ -1,10 +1,11 @@ package org.wordpress.android.util.publicdata import android.content.pm.PackageInfo +import org.wordpress.android.util.extensions.getPackageInfoCompat import org.wordpress.android.viewmodel.ContextProvider import javax.inject.Inject class PackageManagerWrapper @Inject constructor(private val contextProvider: ContextProvider) { fun getPackageInfo(packageName: String, flags: Int = 0): PackageInfo? = - contextProvider.getContext().packageManager.getPackageInfo(packageName, flags) + contextProvider.getContext().packageManager.getPackageInfoCompat(packageName, flags) } diff --git a/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt b/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt index f693c397b394..2095bf4aedc8 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt @@ -4,6 +4,7 @@ import android.annotation.TargetApi import android.content.pm.PackageManager import android.os.Build.VERSION import android.os.Build.VERSION_CODES +import org.wordpress.android.util.extensions.getPackageInfoCompat import org.wordpress.android.viewmodel.ContextProvider import java.security.MessageDigest import javax.inject.Inject @@ -28,8 +29,11 @@ class SignatureUtils @Inject constructor( trustedPackageId: String, trustedSignatureHash: String ): Boolean = try { - val signingInfo = contextProvider.getContext().packageManager.getPackageInfo( - trustedPackageId, PackageManager.GET_SIGNING_CERTIFICATES + val signingInfo = requireNotNull( + contextProvider.getContext().packageManager.getPackageInfoCompat( + trustedPackageId, + PackageManager.GET_SIGNING_CERTIFICATES + ) ).signingInfo if (signingInfo.hasMultipleSigners()) { throw SignatureNotFoundException() diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/plugins/PluginBrowserViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/plugins/PluginBrowserViewModel.kt index be200abd07fc..8290e4ad2561 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/plugins/PluginBrowserViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/plugins/PluginBrowserViewModel.kt @@ -30,6 +30,7 @@ import org.wordpress.android.ui.ListDiffCallback import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T import org.wordpress.android.util.SiteUtils +import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.plugins.PluginBrowserViewModel.PluginListType.FEATURED import org.wordpress.android.viewmodel.plugins.PluginBrowserViewModel.PluginListType.NEW import org.wordpress.android.viewmodel.plugins.PluginBrowserViewModel.PluginListType.POPULAR @@ -138,7 +139,7 @@ class PluginBrowserViewModel @Inject constructor( // read from the bundle return } - site = savedInstanceState.getSerializable(WordPress.SITE) as SiteModel + site = requireNotNull(savedInstanceState.getSerializableCompat(WordPress.SITE)) searchQuery = requireNotNull(savedInstanceState.getString(KEY_SEARCH_QUERY)) setTitle(savedInstanceState.getString(KEY_TITLE)) } diff --git a/WordPress/src/test/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModelTest.kt index 43560b33d49c..7a267b1a8799 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/accounts/login/jetpack/LoginNoSitesViewModelTest.kt @@ -21,6 +21,7 @@ import org.wordpress.android.ui.accounts.UnifiedLoginTracker import org.wordpress.android.ui.accounts.login.jetpack.LoginNoSitesViewModel.State.NoUser import org.wordpress.android.ui.accounts.login.jetpack.LoginNoSitesViewModel.State.ShowUser import org.wordpress.android.ui.accounts.login.jetpack.LoginNoSitesViewModel.UiModel +import org.wordpress.android.util.extensions.getSerializableCompat private const val USERNAME = "username" private const val DISPLAY_NAME = "display_name" @@ -152,11 +153,11 @@ class LoginNoSitesViewModelTest : BaseUnitTest() { } private fun setupInstanceStateForNoUser() { - whenever(savedInstanceState.getSerializable(KEY_STATE)).thenReturn(NoUser) + whenever(savedInstanceState.getSerializableCompat(KEY_STATE)).thenReturn(NoUser) } private fun setupInstanceStateForShowUser() { - whenever(savedInstanceState.getSerializable(KEY_STATE)).thenReturn( + whenever(savedInstanceState.getSerializableCompat(KEY_STATE)).thenReturn( ShowUser( userName = USERNAME, displayName = DISPLAY_NAME, diff --git a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModelTest.kt index 48f14274e95e..aa6290a639b4 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadViewModelTest.kt @@ -42,6 +42,7 @@ import org.wordpress.android.ui.jetpack.common.providers.JetpackAvailableItemsPr import org.wordpress.android.ui.jetpack.usecases.GetActivityLogItemUseCase import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.utils.UiString.UiStringRes +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.text.PercentFormatter import org.wordpress.android.util.wizard.WizardManager import org.wordpress.android.util.wizard.WizardNavigationTarget @@ -426,7 +427,7 @@ class BackupDownloadViewModelTest : BaseUnitTest() { private fun startViewModelForProgress() { whenever(savedInstanceState.getInt(KEY_BACKUP_DOWNLOAD_CURRENT_STEP)) .thenReturn(BackupDownloadStep.PROGRESS.id) - whenever(savedInstanceState.getParcelable(KEY_BACKUP_DOWNLOAD_STATE)) + whenever(savedInstanceState.getParcelableCompat(KEY_BACKUP_DOWNLOAD_STATE)) .thenReturn(backupDownloadState) whenever(percentFormatter.format(30)) .thenReturn("30%") @@ -439,7 +440,7 @@ class BackupDownloadViewModelTest : BaseUnitTest() { private fun startViewModelForComplete(backupDownloadState: BackupDownloadState? = null) { whenever(savedInstanceState.getInt(KEY_BACKUP_DOWNLOAD_CURRENT_STEP)) .thenReturn(BackupDownloadStep.COMPLETE.id) - whenever(savedInstanceState.getParcelable(KEY_BACKUP_DOWNLOAD_STATE)) + whenever(savedInstanceState.getParcelableCompat(KEY_BACKUP_DOWNLOAD_STATE)) .thenReturn(backupDownloadState) startViewModel(savedInstanceState) } @@ -447,7 +448,7 @@ class BackupDownloadViewModelTest : BaseUnitTest() { private fun startViewModelForError() { whenever(savedInstanceState.getInt(KEY_BACKUP_DOWNLOAD_CURRENT_STEP)) .thenReturn(BackupDownloadStep.ERROR.id) - whenever(savedInstanceState.getParcelable(KEY_BACKUP_DOWNLOAD_STATE)) + whenever(savedInstanceState.getParcelableCompat(KEY_BACKUP_DOWNLOAD_STATE)) .thenReturn(backupDownloadState) startViewModel(savedInstanceState) } diff --git a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModelTest.kt index b676056375cc..0c50149d97b9 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/jetpack/restore/RestoreViewModelTest.kt @@ -60,6 +60,7 @@ import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.utils.HtmlMessageUtils import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.ui.utils.UiString.UiStringText +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.text.PercentFormatter import org.wordpress.android.util.wizard.WizardManager import org.wordpress.android.util.wizard.WizardNavigationTarget @@ -459,7 +460,7 @@ class RestoreViewModelTest : BaseUnitTest() { private fun startViewModelForStep(step: RestoreStep, restoreState: RestoreState? = null) { whenever(savedInstanceState.getInt(KEY_RESTORE_CURRENT_STEP)) .thenReturn(step.id) - whenever(savedInstanceState.getParcelable(KEY_RESTORE_STATE)) + whenever(savedInstanceState.getParcelableCompat(KEY_RESTORE_STATE)) .thenReturn(restoreState ?: this.restoreState) startViewModel(savedInstanceState) } diff --git a/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVMTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVMTest.kt index 70bee937febc..8ac0ea6a7103 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVMTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/SiteCreationMainVMTest.kt @@ -39,6 +39,7 @@ import org.wordpress.android.ui.sitecreation.usecases.FetchHomePageLayoutsUseCas import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.config.SiteCreationDomainPurchasingFeatureConfig import org.wordpress.android.util.experiments.SiteCreationDomainPurchasingExperiment +import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.wizard.WizardManager import org.wordpress.android.viewmodel.SingleLiveEvent @@ -245,7 +246,7 @@ class SiteCreationMainVMTest : BaseUnitTest() { /* we need to model a real use case of data only existing for steps the user has visited (Segment only in this case). Otherwise, subsequent steps' state will be cleared and make the test fail. (issue #10189)*/ val expectedState = SiteCreationState(segmentId = SEGMENT_ID) - whenever(savedInstanceState.getParcelable(KEY_SITE_CREATION_STATE)) + whenever(savedInstanceState.getParcelableCompat(KEY_SITE_CREATION_STATE)) .thenReturn(expectedState) // we need to create a new instance of the VM as the `viewModel` has already been started in setUp() @@ -266,7 +267,7 @@ class SiteCreationMainVMTest : BaseUnitTest() { whenever(savedInstanceState.getInt(KEY_CURRENT_STEP)).thenReturn(index) // siteCreationState is not nullable - we need to set it - whenever(savedInstanceState.getParcelable(KEY_SITE_CREATION_STATE)) + whenever(savedInstanceState.getParcelableCompat(KEY_SITE_CREATION_STATE)) .thenReturn(SiteCreationState()) // we need to create a new instance of the VM as the `viewModel` has already been started in setUp() @@ -290,7 +291,7 @@ class SiteCreationMainVMTest : BaseUnitTest() { @Test fun `given instance state is not null, when start, then site creation accessed is not tracked`() { val expectedState = SiteCreationState(segmentId = SEGMENT_ID) - whenever(savedInstanceState.getParcelable(KEY_SITE_CREATION_STATE)) + whenever(savedInstanceState.getParcelableCompat(KEY_SITE_CREATION_STATE)) .thenReturn(expectedState) val newViewModel = getNewViewModel() diff --git a/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModelTest.kt index edbb991c60d2..9c31c26cfd3b 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/previews/SitePreviewViewModelTest.kt @@ -45,6 +45,7 @@ import org.wordpress.android.ui.sitecreation.services.SiteCreationServiceState.S import org.wordpress.android.ui.sitecreation.theme.defaultTemplateSlug import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.UrlUtilsWrapper +import org.wordpress.android.util.extensions.getParcelableCompat private const val SUB_DOMAIN = "test" private const val DOMAIN = ".wordpress.com" @@ -302,7 +303,7 @@ class SitePreviewViewModelTest : BaseUnitTest() { @Test fun `show fullscreen progress when restoring from SiteNotCreated state`() = testWithSuccessResponse { - whenever(bundle.getParcelable(KEY_CREATE_SITE_STATE)).thenReturn(SiteNotCreated) + whenever(bundle.getParcelableCompat(KEY_CREATE_SITE_STATE)).thenReturn(SiteNotCreated) initViewModel(bundle) assertThat(viewModel.uiState.value).isInstanceOf(SitePreviewFullscreenProgressUiState::class.java) @@ -311,7 +312,7 @@ class SitePreviewViewModelTest : BaseUnitTest() { @Test fun `service started when restoring from SiteNotCreated state`() { - whenever(bundle.getParcelable(KEY_CREATE_SITE_STATE)).thenReturn(SiteNotCreated) + whenever(bundle.getParcelableCompat(KEY_CREATE_SITE_STATE)).thenReturn(SiteNotCreated) initViewModel(bundle) assertThat(viewModel.startCreateSiteService.value).isNotNull @@ -319,7 +320,7 @@ class SitePreviewViewModelTest : BaseUnitTest() { @Test fun `show fullscreen progress when restoring from SiteNotInLocalDb state`() = testWithSuccessResponse { - whenever(bundle.getParcelable(KEY_CREATE_SITE_STATE)).thenReturn(SiteNotCreated) + whenever(bundle.getParcelableCompat(KEY_CREATE_SITE_STATE)).thenReturn(SiteNotCreated) initViewModel(bundle) assertThat(viewModel.uiState.value).isInstanceOf(SitePreviewFullscreenProgressUiState::class.java) @@ -328,7 +329,7 @@ class SitePreviewViewModelTest : BaseUnitTest() { @Test fun `start pre-loading WebView when restoring from SiteNotInLocalDb state`() = testWithSuccessResponse { - whenever(bundle.getParcelable(KEY_CREATE_SITE_STATE)) + whenever(bundle.getParcelableCompat(KEY_CREATE_SITE_STATE)) .thenReturn(SiteNotInLocalDb(REMOTE_SITE_ID, false)) initViewModel(bundle) @@ -337,7 +338,7 @@ class SitePreviewViewModelTest : BaseUnitTest() { @Test fun `fetch newly created SiteModel when restoring from SiteNotInLocalDb state`() = testWithSuccessResponse { - whenever(bundle.getParcelable(KEY_CREATE_SITE_STATE)) + whenever(bundle.getParcelableCompat(KEY_CREATE_SITE_STATE)) .thenReturn(SiteNotInLocalDb(REMOTE_SITE_ID, false)) initViewModel(bundle) @@ -346,7 +347,7 @@ class SitePreviewViewModelTest : BaseUnitTest() { @Test fun `start pre-loading WebView when restoring from SiteCreationCompleted state`() { - whenever(bundle.getParcelable(KEY_CREATE_SITE_STATE)) + whenever(bundle.getParcelableCompat(KEY_CREATE_SITE_STATE)) .thenReturn(SiteCreationCompleted(LOCAL_SITE_ID, false)) initViewModel(bundle) diff --git a/build.gradle b/build.gradle index 9a908f005bd8..b985cccdbf3d 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ plugins { ext { minSdkVersion = 24 - compileSdkVersion = 31 + compileSdkVersion = 33 targetSdkVersion = 31 } diff --git a/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/EditImageActivity.kt b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/EditImageActivity.kt index ed0e7a729d12..a4e594eadbdc 100644 --- a/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/EditImageActivity.kt +++ b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/EditImageActivity.kt @@ -1,6 +1,7 @@ package org.wordpress.android.imageeditor import android.os.Bundle +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.lifecycle.ViewModelProvider @@ -10,6 +11,7 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.NavigationUI.setupActionBarWithNavController import androidx.navigation.ui.navigateUp import org.wordpress.android.imageeditor.ImageEditor.EditorAction.EditorCancelled +import org.wordpress.android.imageeditor.utils.onBackPressedCompat class EditImageActivity : AppCompatActivity() { private lateinit var viewModel: EditImageViewModel @@ -25,6 +27,13 @@ class EditImageActivity : AppCompatActivity() { viewModel = ViewModelProvider(this).get(EditImageViewModel::class.java) setContentView(R.layout.activity_edit_image) + onBackPressedDispatcher.addCallback(this) { + onBackPressedDispatcher.onBackPressedCompat(this) + if (hostFragment.childFragmentManager.backStackEntryCount == 0) { + ImageEditor.instance.onEditorAction(EditorCancelled) + } + } + hostFragment = supportFragmentManager .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: throw (NullPointerException("Host fragment is null inside ${this::class.java.simpleName} onCreate.")) @@ -40,7 +49,7 @@ class EditImageActivity : AppCompatActivity() { // Passing in an empty set of top-level destination to display back button on the start destination appBarConfiguration = AppBarConfiguration.Builder().setFallbackOnNavigateUpListener { // Handle app bar's back button on start destination - onBackPressed() + onBackPressedDispatcher.onBackPressed() true }.build() @@ -53,17 +62,10 @@ class EditImageActivity : AppCompatActivity() { // Using popUpToInclusive for popping the start destination of the graph off the back stack // in a multi-module project doesn't seem to be working. Explicitly invoking back action as a workaround. // Related issue: https://issuetracker.google.com/issues/147312109 - onBackPressed() + onBackPressedDispatcher.onBackPressed() true } else { navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() } } - - override fun onBackPressed() { - super.onBackPressed() - if (hostFragment.childFragmentManager.backStackEntryCount == 0) { - ImageEditor.instance.onEditorAction(EditorCancelled) - } - } } diff --git a/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/crop/CropViewModel.kt b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/crop/CropViewModel.kt index 9a435262331d..34935886c9e9 100644 --- a/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/crop/CropViewModel.kt +++ b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/crop/CropViewModel.kt @@ -23,6 +23,8 @@ import org.wordpress.android.imageeditor.crop.CropViewModel.ImageCropAndSaveStat import org.wordpress.android.imageeditor.crop.CropViewModel.UiState.UiLoadedState import org.wordpress.android.imageeditor.crop.CropViewModel.UiState.UiStartLoadingWithBundleState import org.wordpress.android.imageeditor.preview.PreviewImageFragment.Companion.EditImageData.OutputData +import org.wordpress.android.imageeditor.utils.getParcelableCompat +import org.wordpress.android.imageeditor.utils.getParcelableExtraCompat import org.wordpress.android.imageeditor.viewmodel.Event import java.io.File import java.io.Serializable @@ -158,10 +160,10 @@ class CropViewModel : ViewModel() { private fun createCropResult(cropResultCode: Int, cropData: Intent) = CropResult(cropResultCode, cropData) private fun getOutputPath(): String = - cropOptionsBundleWithFilesInfo.getParcelable(UCrop.EXTRA_OUTPUT_URI)?.path ?: "" + cropOptionsBundleWithFilesInfo.getParcelableCompat(UCrop.EXTRA_OUTPUT_URI)?.path ?: "" fun getOutputData(cropResult: CropResult): ArrayList { - val imageUri: Uri? = cropResult.data.getParcelableExtra(UCrop.EXTRA_OUTPUT_URI) + val imageUri = cropResult.data.getParcelableExtraCompat(UCrop.EXTRA_OUTPUT_URI) return if (imageUri != null) { arrayListOf(OutputData(imageUri.toString())) diff --git a/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/preview/PreviewImageFragment.kt b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/preview/PreviewImageFragment.kt index 995f4f6d1145..9bc2e25e7e89 100644 --- a/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/preview/PreviewImageFragment.kt +++ b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/preview/PreviewImageFragment.kt @@ -40,6 +40,8 @@ import org.wordpress.android.imageeditor.preview.PreviewImageViewModel.UiState import org.wordpress.android.imageeditor.utils.ToastUtils import org.wordpress.android.imageeditor.utils.ToastUtils.Duration import org.wordpress.android.imageeditor.utils.UiHelpers +import org.wordpress.android.imageeditor.utils.getParcelableArrayListExtraCompat +import org.wordpress.android.imageeditor.utils.getParcelableExtraCompat import java.io.File class PreviewImageFragment : Fragment(R.layout.preview_image_fragment), MenuProvider { @@ -150,7 +152,7 @@ class PreviewImageFragment : Fragment(R.layout.preview_image_fragment), MenuProv viewModel = ViewModelProvider(this@PreviewImageFragment).get(PreviewImageViewModel::class.java) parentViewModel = ViewModelProvider(requireActivity()).get(EditImageViewModel::class.java) setupObservers() - val inputData = nonNullIntent.getParcelableArrayListExtra(ARG_EDIT_IMAGE_DATA) + val inputData = nonNullIntent.getParcelableArrayListExtraCompat(ARG_EDIT_IMAGE_DATA) inputData?.let { viewModel.onCreateView(it, ImageEditor.instance) } } @@ -186,7 +188,7 @@ class PreviewImageFragment : Fragment(R.layout.preview_image_fragment), MenuProv if (it.resultCode == RESULT_OK) { val data: Intent = it.data if (data.hasExtra(UCrop.EXTRA_OUTPUT_URI)) { - val imageUri = data.getParcelableExtra(UCrop.EXTRA_OUTPUT_URI) as? Uri + val imageUri = data.getParcelableExtraCompat(UCrop.EXTRA_OUTPUT_URI) imageUri?.let { uri -> viewModel.onCropResult(uri.toString()) } diff --git a/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/utils/CompatExtensions.kt b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/utils/CompatExtensions.kt new file mode 100644 index 000000000000..6acead63ae35 --- /dev/null +++ b/libs/image-editor/src/main/kotlin/org/wordpress/android/imageeditor/utils/CompatExtensions.kt @@ -0,0 +1,60 @@ +package org.wordpress.android.imageeditor.utils + +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.os.Parcelable +import androidx.activity.OnBackPressedCallback +import androidx.activity.OnBackPressedDispatcher + +/** + * This is a temporary workaround for the issue described here: https://issuetracker.google.com/issues/247982487 + * This function temporary disables the callback to allow the system to handle the back pressed event. + * + * TODO: Replace this temporary workaround before enabling predictive back gesture on this project + * (android:enableOnBackInvokedCallback="true"). + * + * Related Issue: https://github.com/wordpress-mobile/WordPress-Android/issues/18053 + */ +@Suppress("ForbiddenComment") +fun OnBackPressedDispatcher.onBackPressedCompat(onBackPressedCallback: OnBackPressedCallback) { + onBackPressedCallback.isEnabled = false + onBackPressed() + onBackPressedCallback.isEnabled = true +} + +/** + * TODO: Remove this when stable androidx.core 1.10 is released. Use IntentCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Intent.getParcelableExtraCompat(key: String): T? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableExtra(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableExtra(key) as T? + } + +/** + * TODO: Remove this when stable androidx.core 1.10 is released. Use IntentCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Intent.getParcelableArrayListExtraCompat(key: String): ArrayList? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableArrayListExtra(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableArrayListExtra(key) + } + +/** + * TODO: Remove this when stable androidx.core 1.10 is released. Use BundleCompat instead. + */ +@Suppress("ForbiddenComment") +inline fun Bundle.getParcelableCompat(key: String): T? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelable(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelable(key) + }