From dfd8dbaf3a31dc8b1228310a0149ab3e035dc5c6 Mon Sep 17 00:00:00 2001 From: Material Design Team Date: Mon, 9 May 2022 11:05:27 -0400 Subject: [PATCH] [M3][Color] Refactored PreferencesActivity to allow configurations on any activity-level preferences/options PiperOrigin-RevId: 447470760 --- .../catalog/feature/DemoActivity.java | 25 +------- .../material/catalog/main/MainActivity.java | 10 +++- .../preferences/BaseCatalogActivity.java | 57 +++++++++++++++++++ .../preferences/CatalogPreferencesHelper.java | 6 +- 4 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 catalog/java/io/material/catalog/preferences/BaseCatalogActivity.java diff --git a/catalog/java/io/material/catalog/feature/DemoActivity.java b/catalog/java/io/material/catalog/feature/DemoActivity.java index b50fb20f239..b4751056e16 100644 --- a/catalog/java/io/material/catalog/feature/DemoActivity.java +++ b/catalog/java/io/material/catalog/feature/DemoActivity.java @@ -22,7 +22,6 @@ import android.os.Build.VERSION_CODES; import android.os.Bundle; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import android.view.LayoutInflater; import android.view.MenuItem; @@ -34,15 +33,11 @@ import com.google.android.material.color.MaterialColors; import com.google.android.material.transition.platform.MaterialContainerTransform; import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback; -import dagger.android.AndroidInjection; -import dagger.android.AndroidInjector; -import dagger.android.DispatchingAndroidInjector; -import dagger.android.HasAndroidInjector; +import io.material.catalog.preferences.BaseCatalogActivity; import io.material.catalog.windowpreferences.WindowPreferencesManager; -import javax.inject.Inject; /** Base Activity class that provides a demo screen structure for a single demo. */ -public abstract class DemoActivity extends AppCompatActivity implements HasAndroidInjector { +public abstract class DemoActivity extends BaseCatalogActivity { public static final String EXTRA_DEMO_TITLE = "demo_title"; @@ -51,8 +46,6 @@ public abstract class DemoActivity extends AppCompatActivity implements HasAndro private Toolbar toolbar; private ViewGroup demoContainer; - @Inject DispatchingAndroidInjector androidInjector; - @Override protected void onCreate(@Nullable Bundle bundle) { if (shouldSetUpContainerTransform()) { @@ -63,7 +56,6 @@ protected void onCreate(@Nullable Bundle bundle) { getWindow().setSharedElementReturnTransition(buildContainerTransform(/* entering= */ false)); } - safeInject(); super.onCreate(bundle); if (shouldApplyEdgeToEdgePreference()) { @@ -111,19 +103,6 @@ protected boolean shouldApplyEdgeToEdgePreference() { return true; } - @Override - public AndroidInjector androidInjector() { - return androidInjector; - } - - private void safeInject() { - try { - AndroidInjection.inject(this); - } catch (Exception e) { - // Ignore exception, not all DemoActivity subclasses need to inject - } - } - @RequiresApi(VERSION_CODES.LOLLIPOP) private MaterialContainerTransform buildContainerTransform(boolean entering) { MaterialContainerTransform transform = new MaterialContainerTransform(this, entering); diff --git a/catalog/java/io/material/catalog/main/MainActivity.java b/catalog/java/io/material/catalog/main/MainActivity.java index a167db9c7ff..4191e8f2e96 100644 --- a/catalog/java/io/material/catalog/main/MainActivity.java +++ b/catalog/java/io/material/catalog/main/MainActivity.java @@ -26,12 +26,11 @@ import com.google.common.base.Optional; import dagger.BindsOptionalOf; import dagger.android.ContributesAndroidInjector; -import dagger.android.support.DaggerAppCompatActivity; 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.CatalogPreferencesHelper.PreferencesActivity; +import io.material.catalog.preferences.BaseCatalogActivity; import io.material.catalog.preferences.ThemeOverlayUtils; import io.material.catalog.tableofcontents.TocFragment; import io.material.catalog.tableofcontents.TocModule; @@ -42,7 +41,7 @@ * The main launcher activity for the Catalog, capable of displaying a number of different screens * via Fragments. */ -public class MainActivity extends DaggerAppCompatActivity implements PreferencesActivity { +public class MainActivity extends BaseCatalogActivity { @Inject Optional internalOptionsMenu; TocFragment tocFragment; @@ -100,6 +99,11 @@ public void onBackPressed() { super.onBackPressed(); } + @Override + public boolean isPreferencesEnabled() { + return true; + } + private boolean handleFragmentOnBackPressed() { Fragment currentFragment = FeatureDemoUtils.getCurrentFragment(this); return currentFragment instanceof OnBackPressedHandler diff --git a/catalog/java/io/material/catalog/preferences/BaseCatalogActivity.java b/catalog/java/io/material/catalog/preferences/BaseCatalogActivity.java new file mode 100644 index 00000000000..18676ae813d --- /dev/null +++ b/catalog/java/io/material/catalog/preferences/BaseCatalogActivity.java @@ -0,0 +1,57 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.material.catalog.preferences; + +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.annotation.Nullable; +import dagger.android.AndroidInjection; +import dagger.android.AndroidInjector; +import dagger.android.DispatchingAndroidInjector; +import dagger.android.HasAndroidInjector; +import javax.inject.Inject; + +/** This configures activity-level options/preferences. */ +public class BaseCatalogActivity extends AppCompatActivity implements HasAndroidInjector { + + @Inject DispatchingAndroidInjector androidInjector; + + @Override + protected void onCreate(@Nullable Bundle bundle) { + safeInject(); + super.onCreate(bundle); + } + + /** Returns {@code true} if preferences option is enabled. */ + public boolean isPreferencesEnabled() { + return false; + } + + @Override + public AndroidInjector androidInjector() { + return androidInjector; + } + + @SuppressWarnings("CatchingUnchecked") + private void safeInject() { + try { + AndroidInjection.inject(this); + } catch (Exception e) { + // Ignore exception, not all DemoActivity subclasses need to inject + } + } +} diff --git a/catalog/java/io/material/catalog/preferences/CatalogPreferencesHelper.java b/catalog/java/io/material/catalog/preferences/CatalogPreferencesHelper.java index 2a78b679dea..69fc984c647 100644 --- a/catalog/java/io/material/catalog/preferences/CatalogPreferencesHelper.java +++ b/catalog/java/io/material/catalog/preferences/CatalogPreferencesHelper.java @@ -34,7 +34,8 @@ public CatalogPreferencesHelper(@NonN fragmentManager = fragment.getParentFragmentManager(); enabled = fragment.shouldShowDefaultDemoActionBar() - && fragment.getActivity() instanceof PreferencesActivity; + && fragment.getActivity() instanceof BaseCatalogActivity + && ((BaseCatalogActivity) fragment.getActivity()).isPreferencesEnabled(); if (enabled) { fragment.setHasOptionsMenu(true); @@ -66,9 +67,6 @@ private void showPreferences() { new CatalogPreferencesDialogFragment().show(fragmentManager, "preferences"); } - /** Implement this interface to include an Activity for preferences screen support. */ - public interface PreferencesActivity {} - /** * Implement this interface to allow a Fragment to be used with {@link CatalogPreferencesHelper}. */