Skip to content

Commit 2cf1040

Browse files
gsajithcketcham
authored andcommitted
Add bridge themes for Material Components
PiperOrigin-RevId: 204852599
1 parent f777c67 commit 2cf1040

File tree

8 files changed

+122
-28
lines changed

8 files changed

+122
-28
lines changed

docs/getting-started.md

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,13 @@ Material Components theme is the recommended approach. However, be sure to
7272
test thoroughly afterwards, as components in existing layouts may change
7373
their looks and behavior.
7474
75-
Note: If you **can't** change your theme, you can continue to inherit from an
76-
AppCompat theme and add some new theme attributes to your theme. See the [**App
77-
Compat Themes**](#app-compat-themes) section for more details.
75+
Note: If you **can't** change your theme, you can do one of the following:
76+
77+
* Inherit from one of our Material Components **Bridge** themes. See the
78+
[**Bridge Themes**](#bridge-themes) section for more details.
79+
* Continue to inherit from an AppCompat theme and add some new theme
80+
attributes to your theme. See the
81+
[**App Compat Themes**](#app-compat-themes) section for more details.
7882
7983
#### **Material Components themes**
8084
@@ -103,6 +107,29 @@ replaces default components with their Material counterparts. Currently, this
103107
only replaces `<Button>` XML components with
104108
[`<MaterialButton>`](components/MaterialButton.md).
105109

110+
#### **Bridge Themes** {#bridge-themes}
111+
112+
If you cannot change your theme to inherit from a Material Components theme, you
113+
can inherit from a Material Components **Bridge** theme.
114+
115+
```xml
116+
<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light.Bridge">
117+
<!-- ... -->
118+
</style>
119+
```
120+
121+
Both `Theme.MaterialComponents` and `Theme.MaterialComponents.Light` have
122+
`.Bridge` themes:
123+
124+
* `Theme.MaterialComponents.Bridge`
125+
* `Theme.MaterialComponents.Light.Bridge`
126+
* `Theme.MaterialComponents.NoActionBar.Bridge`
127+
* `Theme.MaterialComponents.Light.NoActionBar.Bridge`
128+
129+
Bridge themes inherit from AppCompat themes, but also define the new Material
130+
Components theme attributes for you. If you use a bridge theme, you can start
131+
using Material Design components without changing your app theme.
132+
106133
#### **AppCompat Themes** {#app-compat-themes}
107134

108135
You can also incrementally test new Material components without changing
@@ -124,7 +151,19 @@ theme, or you will encounter `ThemeEnforcement` errors:
124151
<!-- New MaterialComponents attributes. -->
125152
<item name="colorSecondary">?attr/colorPrimary</item>
126153
<item name="scrimBackground">@color/mtrl_scrim_color</item>
127-
<item name="snackbarButtonStyle">?attr/borderlessButtonStyle</item>
154+
<item name="textAppearanceHeadline1">@style/TextAppearance.MaterialComponents.Headline1</item>
155+
<item name="textAppearanceHeadline2">@style/TextAppearance.MaterialComponents.Headline2</item>
156+
<item name="textAppearanceHeadline3">@style/TextAppearance.MaterialComponents.Headline3</item>
157+
<item name="textAppearanceHeadline4">@style/TextAppearance.MaterialComponents.Headline4</item>
158+
<item name="textAppearanceHeadline5">@style/TextAppearance.MaterialComponents.Headline5</item>
159+
<item name="textAppearanceHeadline6">@style/TextAppearance.MaterialComponents.Headline6</item>
160+
<item name="textAppearanceSubtitle1">@style/TextAppearance.MaterialComponents.Subtitle1</item>
161+
<item name="textAppearanceSubtitle2">@style/TextAppearance.MaterialComponents.Subtitle2</item>
162+
<item name="textAppearanceBody1">@style/TextAppearance.MaterialComponents.Body1</item>
163+
<item name="textAppearanceBody2">@style/TextAppearance.MaterialComponents.Body2</item>
164+
<item name="textAppearanceCaption">@style/TextAppearance.MaterialComponents.Caption</item>
165+
<item name="textAppearanceButton">@style/TextAppearance.MaterialComponents.Button</item>
166+
<item name="textAppearanceOverline">@style/TextAppearance.MaterialComponents.Overline</item>
128167

129168
</style>
130169
```

lib/java/com/google/android/material/color/res-public/values/public.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
<resources>
1818
<public name="colorSecondary" type="attr"/>
1919
<public name="scrimBackground" type="attr"/>
20-
<public name="colorBackgroundFloating" type="attr"/>
2120
<public name="design_default_color_primary" type="color"/>
2221
<public name="design_default_color_primary_dark" type="color"/>
2322
</resources>

lib/java/com/google/android/material/color/res/values/attrs.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,4 @@
2222
The background can either be a color or a bitmap drawable with tileMode set to repeat. -->
2323
<attr name="scrimBackground" format="color|reference"/>
2424

25-
<!-- Default color of background imagery for floating components, ex. dialogs, popups, and cards. -->
26-
<attr name="colorBackgroundFloating" format="color" />
27-
2825
</resources>

lib/java/com/google/android/material/dialog/res/values/themes_base.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
<item name="colorAccent">?attr/colorSecondary</item>
4343

4444
<item name="scrimBackground">@color/mtrl_scrim_color</item>
45-
<item name="colorBackgroundFloating">@color/background_floating_material_dark</item>
4645

4746
<!-- Widget styles -->
4847
<item name="borderlessButtonStyle">@style/Widget.MaterialComponents.Button.TextButton</item>
@@ -90,7 +89,6 @@
9089
<item name="colorAccent">?attr/colorSecondary</item>
9190

9291
<item name="scrimBackground">@color/mtrl_scrim_color</item>
93-
<item name="colorBackgroundFloating">@color/background_floating_material_light</item>
9492

9593
<!-- Widget styles -->
9694
<item name="borderlessButtonStyle">@style/Widget.MaterialComponents.Button.TextButton</item>

lib/java/com/google/android/material/snackbar/Snackbar.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222

2323
import android.content.Context;
2424
import android.content.res.ColorStateList;
25+
import android.content.res.TypedArray;
2526
import android.support.annotation.ColorInt;
2627
import android.support.annotation.IntDef;
2728
import android.support.annotation.IntRange;
2829
import android.support.annotation.NonNull;
2930
import android.support.annotation.Nullable;
3031
import android.support.annotation.RestrictTo;
3132
import android.support.annotation.StringRes;
32-
import com.google.android.material.internal.ThemeEnforcement;
3333
import android.support.design.widget.CoordinatorLayout;
3434
import android.text.TextUtils;
3535
import android.util.AttributeSet;
@@ -40,7 +40,6 @@
4040
import android.view.accessibility.AccessibilityManager;
4141
import android.widget.FrameLayout;
4242
import android.widget.TextView;
43-
4443
import java.lang.annotation.Retention;
4544
import java.lang.annotation.RetentionPolicy;
4645

@@ -93,6 +92,8 @@ public final class Snackbar extends BaseTransientBottomBar<Snackbar> {
9392
*/
9493
public static final int LENGTH_LONG = BaseTransientBottomBar.LENGTH_LONG;
9594

95+
private static final int[] SNACKBAR_BUTTON_STYLE_ATTR = new int[] {R.attr.snackbarButtonStyle};
96+
9697
/**
9798
* Callback class for {@link Snackbar} instances.
9899
*
@@ -182,11 +183,10 @@ public static Snackbar make(
182183
}
183184

184185
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
185-
final boolean isUsingMaterialTheme = ThemeEnforcement.isMaterialTheme(parent.getContext());
186186
final SnackbarContentLayout content =
187187
(SnackbarContentLayout)
188188
inflater.inflate(
189-
isUsingMaterialTheme
189+
hasSnackbarButtonStyleAttr(parent.getContext())
190190
? R.layout.mtrl_layout_snackbar_include
191191
: R.layout.design_layout_snackbar_include,
192192
parent,
@@ -197,6 +197,18 @@ public static Snackbar make(
197197
return snackbar;
198198
}
199199

200+
/**
201+
* {@link Snackbar}s should still work with AppCompat themes, which don't specify a {@code
202+
* snackbarButtonStyle}. This method helps to check if a valid {@code snackbarButtonStyle} is set
203+
* within the current context, so that we know whether we can use the attribute.
204+
*/
205+
protected static boolean hasSnackbarButtonStyleAttr(Context context) {
206+
TypedArray a = context.obtainStyledAttributes(SNACKBAR_BUTTON_STYLE_ATTR);
207+
int snackbarButtonStyleResId = a.getResourceId(0, -1);
208+
a.recycle();
209+
return snackbarButtonStyleResId != -1;
210+
}
211+
200212
/**
201213
* Make a Snackbar to display a message.
202214
*

lib/java/com/google/android/material/theme/res-public/values/public.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
<public name="Theme.MaterialComponents.DialogWhenLarge" type="style"/>
2424
<public name="Theme.MaterialComponents.Light.DialogWhenLarge" type="style"/>
2525
<public name="Theme.MaterialComponents.CompactMenu" type="style"/>
26+
<public name="Theme.MaterialComponents.Bridge" type="style"/>
27+
<public name="Theme.MaterialComponents.Light.Bridge" type="style"/>
28+
<public name="Theme.MaterialComponents.NoActionBar.Bridge" type="style"/>
29+
<public name="Theme.MaterialComponents.Light.NoActionBar.Bridge" type="style"/>
30+
<public name="Theme.MaterialComponents.Light.DarkActionBar.Bridge" type="style"/>
2631
<public name="ThemeOverlay.MaterialComponents" type="style"/>
2732
<public name="ThemeOverlay.MaterialComponents.Light" type="style"/>
2833
<public name="ThemeOverlay.MaterialComponents.Dark" type="style"/>

lib/java/com/google/android/material/theme/res/values/themes.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,23 @@
4343
<item name="windowNoTitle">true</item>
4444
</style>
4545

46+
<!-- Bridge themes containing only new attributes defined in MaterialComponents themes. -->
47+
<style name="Theme.MaterialComponents.Bridge" parent="Base.Theme.MaterialComponents.Bridge"/>
48+
49+
<style name="Theme.MaterialComponents.Light.Bridge" parent="Base.Theme.MaterialComponents.Light.Bridge"/>
50+
51+
<style name="Theme.MaterialComponents.NoActionBar.Bridge" parent="Theme.MaterialComponents.Bridge">
52+
<item name="windowActionBar">false</item>
53+
<item name="windowNoTitle">true</item>
54+
</style>
55+
56+
<style name="Theme.MaterialComponents.Light.NoActionBar.Bridge" parent="Theme.MaterialComponents.Light.Bridge">
57+
<item name="windowActionBar">false</item>
58+
<item name="windowNoTitle">true</item>
59+
</style>
60+
61+
<style name="Theme.MaterialComponents.Light.DarkActionBar.Bridge" parent="Base.Theme.MaterialComponents.Light.DarkActionBar.Bridge"/>
62+
4663
<style name="Theme.MaterialComponents.DialogWhenLarge"
4764
parent="Base.Theme.MaterialComponents.DialogWhenLarge">
4865
</style>

lib/java/com/google/android/material/theme/res/values/themes_base.xml

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,35 @@
3030
<!-- All new attributes should be set in the following four Base.V14 themes. -->
3131
<eat-comment/>
3232

33-
<style name="Base.V14.Theme.MaterialComponents" parent="Platform.MaterialComponents">
33+
<style name="Base.V14.Theme.MaterialComponents.Bridge" parent="Platform.MaterialComponents">
34+
<item name="colorSecondary">?attr/colorPrimary</item>
35+
36+
<item name="scrimBackground">@color/mtrl_scrim_color</item>
37+
38+
<!-- Type styles -->
39+
<item name="textAppearanceHeadline1">@style/TextAppearance.MaterialComponents.Headline1</item>
40+
<item name="textAppearanceHeadline2">@style/TextAppearance.MaterialComponents.Headline2</item>
41+
<item name="textAppearanceHeadline3">@style/TextAppearance.MaterialComponents.Headline3</item>
42+
<item name="textAppearanceHeadline4">@style/TextAppearance.MaterialComponents.Headline4</item>
43+
<item name="textAppearanceHeadline5">@style/TextAppearance.MaterialComponents.Headline5</item>
44+
<item name="textAppearanceHeadline6">@style/TextAppearance.MaterialComponents.Headline6</item>
45+
<item name="textAppearanceSubtitle1">@style/TextAppearance.MaterialComponents.Subtitle1</item>
46+
<item name="textAppearanceSubtitle2">@style/TextAppearance.MaterialComponents.Subtitle2</item>
47+
<item name="textAppearanceBody1">@style/TextAppearance.MaterialComponents.Body1</item>
48+
<item name="textAppearanceBody2">@style/TextAppearance.MaterialComponents.Body2</item>
49+
<item name="textAppearanceCaption">@style/TextAppearance.MaterialComponents.Caption</item>
50+
<item name="textAppearanceButton">@style/TextAppearance.MaterialComponents.Button</item>
51+
<item name="textAppearanceOverline">@style/TextAppearance.MaterialComponents.Overline</item>
52+
</style>
53+
54+
<style name="Base.V14.Theme.MaterialComponents" parent="Base.V14.Theme.MaterialComponents.Bridge">
3455
<item name="viewInflaterClass">com.google.android.material.theme.MaterialComponentsViewInflater</item>
3556

3657
<!-- Colors -->
3758
<item name="colorPrimary">@color/design_default_color_primary</item>
3859
<item name="colorPrimaryDark">@color/design_default_color_primary_dark</item>
39-
40-
<item name="colorSecondary">?attr/colorPrimary</item>
41-
4260
<item name="colorAccent">?attr/colorSecondary</item>
4361

44-
<item name="scrimBackground">@color/mtrl_scrim_color</item>
45-
<item name="colorBackgroundFloating">@color/background_floating_material_dark</item>
46-
4762
<!-- Widget styles -->
4863
<item name="borderlessButtonStyle">@style/Widget.MaterialComponents.Button.TextButton</item>
4964
<item name="bottomAppBarStyle">@style/Widget.MaterialComponents.BottomAppBar</item>
@@ -64,6 +79,12 @@
6479
<!-- Dialog themes -->
6580
<item name="alertDialogTheme">@style/ThemeOverlay.MaterialComponents.Dialog.Alert</item>
6681
<item name="android:datePickerDialogTheme" tools:ignore="NewApi">@style/ThemeOverlay.MaterialComponents.Dialog</item>
82+
</style>
83+
84+
<style name="Base.V14.Theme.MaterialComponents.Light.Bridge" parent="Platform.MaterialComponents.Light">
85+
<item name="colorSecondary">?attr/colorPrimary</item>
86+
87+
<item name="scrimBackground">@color/mtrl_scrim_color</item>
6788

6889
<!-- Type styles -->
6990
<item name="textAppearanceHeadline1">@style/TextAppearance.MaterialComponents.Headline1</item>
@@ -81,20 +102,14 @@
81102
<item name="textAppearanceOverline">@style/TextAppearance.MaterialComponents.Overline</item>
82103
</style>
83104

84-
<style name="Base.V14.Theme.MaterialComponents.Light" parent="Platform.MaterialComponents.Light">
105+
<style name="Base.V14.Theme.MaterialComponents.Light" parent="Base.V14.Theme.MaterialComponents.Light.Bridge">
85106
<item name="viewInflaterClass">com.google.android.material.theme.MaterialComponentsViewInflater</item>
86107

87108
<!-- Colors -->
88109
<item name="colorPrimary">@color/design_default_color_primary</item>
89110
<item name="colorPrimaryDark">@color/design_default_color_primary_dark</item>
90-
91-
<item name="colorSecondary">?attr/colorPrimary</item>
92-
93111
<item name="colorAccent">?attr/colorSecondary</item>
94112

95-
<item name="scrimBackground">@color/mtrl_scrim_color</item>
96-
<item name="colorBackgroundFloating">@color/background_floating_material_light</item>
97-
98113
<!-- Widget styles -->
99114
<item name="borderlessButtonStyle">@style/Widget.MaterialComponents.Button.TextButton</item>
100115
<item name="bottomAppBarStyle">@style/Widget.MaterialComponents.BottomAppBar</item>
@@ -115,6 +130,12 @@
115130
<!-- Dialog themes -->
116131
<item name="alertDialogTheme">@style/ThemeOverlay.MaterialComponents.Dialog.Alert</item>
117132
<item name="android:datePickerDialogTheme" tools:ignore="NewApi">@style/ThemeOverlay.MaterialComponents.Dialog</item>
133+
</style>
134+
135+
<style name="Base.V14.Theme.MaterialComponents.Light.DarkActionBar.Bridge" parent="Theme.AppCompat.Light.DarkActionBar">
136+
<item name="colorSecondary">?attr/colorPrimary</item>
137+
138+
<item name="scrimBackground">@color/mtrl_scrim_color</item>
118139

119140
<!-- Type styles -->
120141
<item name="textAppearanceHeadline1">@style/TextAppearance.MaterialComponents.Headline1</item>
@@ -142,8 +163,12 @@
142163

143164
<style name="Base.Theme.MaterialComponents" parent="Base.V14.Theme.MaterialComponents"/>
144165

166+
<style name="Base.Theme.MaterialComponents.Bridge" parent="Base.V14.Theme.MaterialComponents.Bridge"/>
167+
145168
<style name="Base.Theme.MaterialComponents.Light" parent="Base.V14.Theme.MaterialComponents.Light"/>
146169

170+
<style name="Base.Theme.MaterialComponents.Light.Bridge" parent="Base.V14.Theme.MaterialComponents.Light.Bridge"/>
171+
147172
<style name="Base.Theme.MaterialComponents.Light.DarkActionBar" parent="Base.Theme.MaterialComponents.Light">
148173
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents.Light</item>
149174
<item name="actionBarWidgetTheme">@null</item>
@@ -156,6 +181,8 @@
156181
<item name="colorPrimary">@color/primary_material_dark</item>
157182
</style>
158183

184+
<style name="Base.Theme.MaterialComponents.Light.DarkActionBar.Bridge" parent="Base.V14.Theme.MaterialComponents.Light.DarkActionBar.Bridge"/>
185+
159186
<!-- Menu/item attributes -->
160187
<style name="Base.Theme.MaterialComponents.CompactMenu" parent="">
161188
<item name="android:itemTextAppearance">?android:attr/textAppearanceMedium</item>

0 commit comments

Comments
 (0)