Skip to content

Commit

Permalink
[Predictive Back] Migrate Catalog to use AndroidX back pressed callba…
Browse files Browse the repository at this point in the history
…cks and enable predictive back-to-home

PiperOrigin-RevId: 515136472
  • Loading branch information
dsn5ft authored and paulfthomas committed Mar 13, 2023
1 parent 359580b commit 22c4e0d
Show file tree
Hide file tree
Showing 11 changed files with 128 additions and 142 deletions.
1 change: 1 addition & 0 deletions catalog/java/io/material/catalog/AndroidManifest.xml
Expand Up @@ -25,6 +25,7 @@
<application
android:name="io.material.catalog.application.${application_name}"
android:allowBackup="true"
android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/cat_app_name"
android:supportsRtl="true"
Expand Down
Expand Up @@ -28,6 +28,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
Expand All @@ -47,12 +48,19 @@
import com.google.android.material.snackbar.Snackbar;
import io.material.catalog.feature.DemoFragment;
import io.material.catalog.feature.DemoUtils;
import io.material.catalog.feature.OnBackPressedHandler;
import io.material.catalog.preferences.CatalogPreferencesHelper;
import java.util.List;

/** A fragment that displays the main Bottom App Bar demos for the Catalog app. */
public class BottomAppBarMainDemoFragment extends DemoFragment implements OnBackPressedHandler {
public class BottomAppBarMainDemoFragment extends DemoFragment {

private final OnBackPressedCallback bottomDrawerOnBackPressedCallback =
new OnBackPressedCallback(/* enabled= */ false) {
@Override
public void handleOnBackPressed() {
bottomDrawerBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
}
};

protected BottomAppBar bar;
protected View barNavView;
Expand Down Expand Up @@ -152,27 +160,6 @@ private void setUpDemoControls(@NonNull View view) {
(buttonView, isChecked) -> bar.setHideOnScroll(isChecked));
}

@Override
public boolean onBackPressed() {
if (bottomDrawerBehavior.getState() != BottomSheetBehavior.STATE_HIDDEN) {
bottomDrawerBehavior.addBottomSheetCallback(
new BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
barNavView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
}
}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {}
});
bottomDrawerBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
return true;
}
return false;
}

@Override
public boolean shouldShowDefaultDemoActionBar() {
return false;
Expand Down Expand Up @@ -205,6 +192,25 @@ protected void setUpBottomDrawer(View view) {
bottomDrawerBehavior = BottomSheetBehavior.from(bottomDrawer);
bottomDrawerBehavior.setUpdateImportantForAccessibilityOnSiblings(true);
bottomDrawerBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
bottomDrawerBehavior.addBottomSheetCallback(
new BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
bottomDrawerOnBackPressedCallback.setEnabled(
newState == BottomSheetBehavior.STATE_EXPANDED
|| newState == BottomSheetBehavior.STATE_HALF_EXPANDED);
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
barNavView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
}
}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {}
});

requireActivity()
.getOnBackPressedDispatcher()
.addCallback(this, bottomDrawerOnBackPressedCallback);

bar.setNavigationOnClickListener(
v -> bottomDrawerBehavior.setState(BottomSheetBehavior.STATE_HALF_EXPANDED));
Expand Down
22 changes: 0 additions & 22 deletions catalog/java/io/material/catalog/feature/OnBackPressedHandler.java

This file was deleted.

15 changes: 0 additions & 15 deletions catalog/java/io/material/catalog/main/MainActivity.java
Expand Up @@ -28,7 +28,6 @@
import dagger.android.ContributesAndroidInjector;
import io.material.catalog.application.scope.ActivityScope;
import io.material.catalog.feature.FeatureDemoUtils;
import io.material.catalog.feature.OnBackPressedHandler;
import io.material.catalog.internal.InternalOptionsMenuPresenter;
import io.material.catalog.preferences.BaseCatalogActivity;
import io.material.catalog.preferences.ThemeOverlayUtils;
Expand Down Expand Up @@ -91,25 +90,11 @@ public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
if (handleFragmentOnBackPressed()) {
return;
}
super.onBackPressed();
}

@Override
public boolean isPreferencesEnabled() {
return true;
}

private boolean handleFragmentOnBackPressed() {
Fragment currentFragment = FeatureDemoUtils.getCurrentFragment(this);
return currentFragment instanceof OnBackPressedHandler
&& ((OnBackPressedHandler) currentFragment).onBackPressed();
}

/** The Dagger module for {@link MainActivity} dependencies */
@dagger.Module
public abstract static class Module {
Expand Down
16 changes: 15 additions & 1 deletion catalog/java/io/material/catalog/search/SearchDemoUtils.java
Expand Up @@ -21,17 +21,20 @@
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import com.google.android.material.search.SearchBar;
import com.google.android.material.search.SearchView;
import com.google.android.material.search.SearchView.TransitionState;
import com.google.android.material.snackbar.Snackbar;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -51,7 +54,7 @@ public static void setUpSearchBar(Activity activity, SearchBar searchBar) {

@SuppressLint("NewApi")
public static void setUpSearchView(
Activity activity, SearchBar searchBar, SearchView searchView) {
AppCompatActivity activity, SearchBar searchBar, SearchView searchView) {
searchView.inflateMenu(R.menu.cat_searchview_menu);
searchView.setOnMenuItemClickListener(
menuItem -> {
Expand All @@ -65,6 +68,17 @@ public static void setUpSearchView(
submitSearchQuery(searchBar, searchView, searchView.getText().toString());
return false;
});
OnBackPressedCallback onBackPressedCallback =
new OnBackPressedCallback(/* enabled= */ false) {
@Override
public void handleOnBackPressed() {
searchView.hide();
}
};
activity.getOnBackPressedDispatcher().addCallback(activity, onBackPressedCallback);
searchView.addTransitionListener(
(searchView1, previousState, newState) ->
onBackPressedCallback.setEnabled(newState == TransitionState.SHOWN));
}

static void showSnackbar(Activity activity, MenuItem menuItem) {
Expand Down
Expand Up @@ -32,10 +32,6 @@
/** An activity that displays the main Open Search Bar demo for the Catalog app. */
public class SearchMainDemoActivity extends DemoActivity {

private SearchBar searchBar;
private SearchView searchView;
private LinearLayout suggestionContainer;

@Nullable
@Override
public View onCreateDemoView(
Expand All @@ -44,9 +40,9 @@ public View onCreateDemoView(
@Nullable Bundle bundle) {
View view = layoutInflater.inflate(R.layout.cat_search_fragment, viewGroup, false);

searchBar = view.findViewById(R.id.cat_search_bar);
searchView = view.findViewById(R.id.cat_search_view);
suggestionContainer = view.findViewById(R.id.cat_search_view_suggestion_container);
SearchBar searchBar = view.findViewById(R.id.cat_search_bar);
SearchView searchView = view.findViewById(R.id.cat_search_view);
LinearLayout suggestionContainer = view.findViewById(R.id.cat_search_view_suggestion_container);

SearchDemoUtils.setUpSearchBar(this, searchBar);
SearchDemoUtils.setUpSearchView(this, searchBar, searchView);
Expand All @@ -56,15 +52,6 @@ public View onCreateDemoView(
return view;
}

@Override
public void onBackPressed() {
if (searchView.isShowing()) {
searchView.hide();
return;
}
super.onBackPressed();
}

@Override
protected boolean shouldShowDefaultDemoActionBar() {
return false;
Expand Down
Expand Up @@ -30,6 +30,7 @@
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
Expand All @@ -49,6 +50,14 @@ public class SearchRecyclerDemoActivity extends DemoActivity {

private static final int ITEM_COUNT = 30;

private final OnBackPressedCallback contextualToolbarOnBackPressedCallback =
new OnBackPressedCallback(/* enabled= */ false) {
@Override
public void handleOnBackPressed() {
hideContextualToolbarAndClearSelection();
}
};

private List<Item> items;
private Adapter adapter;
private RecyclerView recyclerView;
Expand Down Expand Up @@ -92,19 +101,9 @@ public View onCreateDemoView(
return insets;
});

return view;
}
getOnBackPressedDispatcher().addCallback(this, contextualToolbarOnBackPressedCallback);

@Override
public void onBackPressed() {
if (searchView.isShowing()) {
searchView.hide();
return;
}
if (hideContextualToolbarAndClearSelection()) {
return;
}
super.onBackPressed();
return view;
}

@Override
Expand All @@ -121,10 +120,10 @@ private void setUpRecyclerView() {
long selectedItemCount = getSelectedItemCount();
if (selectedItemCount > 0 && Adapter.selectionModeEnabled) {
contextualToolbar.setTitle(String.valueOf(selectedItemCount));
searchBar.expand(contextualToolbarContainer, appBarLayout);
expandContextualToolbar();
} else {
Adapter.selectionModeEnabled = false;
searchBar.collapse(contextualToolbarContainer, appBarLayout);
collapseContextualToolbar();
}
});

Expand Down Expand Up @@ -156,13 +155,21 @@ private void setUpContextualToolbar() {
});
}

private boolean hideContextualToolbarAndClearSelection() {
private void hideContextualToolbarAndClearSelection() {
Adapter.selectionModeEnabled = false;
if (searchBar.collapse(contextualToolbarContainer, appBarLayout)) {
if (collapseContextualToolbar()) {
setItemsSelected(false);
return true;
}
return false;
}

private void expandContextualToolbar() {
contextualToolbarOnBackPressedCallback.setEnabled(true);
searchBar.expand(contextualToolbarContainer, appBarLayout);
}

private boolean collapseContextualToolbar() {
contextualToolbarOnBackPressedCallback.setEnabled(false);
return searchBar.collapse(contextualToolbarContainer, appBarLayout);
}

private List<Item> generateItems() {
Expand Down
Expand Up @@ -29,6 +29,7 @@
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
Expand All @@ -37,11 +38,9 @@
import com.google.android.material.transition.Hold;
import com.google.android.material.transition.MaterialContainerTransform;
import io.material.catalog.feature.DemoFragment;
import io.material.catalog.feature.OnBackPressedHandler;

/** A fragment that displays the main Transition demo for the Catalog app. */
public class TransitionContainerTransformDemoFragment extends DemoFragment
implements OnBackPressedHandler {
public class TransitionContainerTransformDemoFragment extends DemoFragment {

private static final String END_FRAGMENT_TAG = "END_FRAGMENT_TAG";

Expand Down Expand Up @@ -150,6 +149,18 @@ private void showEndFragment(View sharedElement) {
.replace(R.id.fragment_container, fragment, END_FRAGMENT_TAG)
.addToBackStack("ContainerTransformFragment::end")
.commit();

requireActivity()
.getOnBackPressedDispatcher()
.addCallback(
this,
new OnBackPressedCallback(/* enabled= */ true) {
@Override
public void handleOnBackPressed() {
getChildFragmentManager().popBackStack();
remove();
}
});
}

private void configureTransitions(Fragment fragment) {
Expand All @@ -175,13 +186,4 @@ private MaterialContainerTransform buildContainerTransform(boolean entering) {
configurationHelper.configure(transform, entering);
return transform;
}

@Override
public boolean onBackPressed() {
if (getView().findViewById(R.id.end_root) != null) {
getChildFragmentManager().popBackStack();
return true;
}
return false;
}
}

0 comments on commit 22c4e0d

Please sign in to comment.