Skip to content

Commit f8e3f0b

Browse files
committed
Add corner support for navigation view
Disable corners by default for dynamic theme 2.
1 parent 6f0d961 commit f8e3f0b

File tree

4 files changed

+52
-29
lines changed

4 files changed

+52
-29
lines changed

dynamic-support/src/main/java/com/pranavpandey/android/dynamic/support/Dynamic.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import com.pranavpandey.android.dynamic.support.widget.DynamicFloatingActionButton;
8383
import com.pranavpandey.android.dynamic.support.widget.DynamicMaterialCardView;
8484
import com.pranavpandey.android.dynamic.support.widget.DynamicNavigationRailView;
85+
import com.pranavpandey.android.dynamic.support.widget.DynamicNavigationView;
8586
import com.pranavpandey.android.dynamic.support.widget.DynamicTextInputLayout;
8687
import com.pranavpandey.android.dynamic.support.widget.base.DynamicBackgroundWidget;
8788
import com.pranavpandey.android.dynamic.support.widget.base.DynamicLinkWidget;
@@ -1561,6 +1562,7 @@ public static void setPreventCornerOverlap(@Nullable View view, boolean preventC
15611562
* @param corner The corner to be set.
15621563
*
15631564
* @see DynamicButton#setCorner(Integer)
1565+
* @see DynamicNavigationView#setCorner(Float)
15641566
* @see DynamicBottomNavigationView#setCorner(Float)
15651567
* @see DynamicNavigationRailView#setCorner(Float)
15661568
* @see DynamicFloatingActionButton#setCorner(Float)
@@ -1572,6 +1574,8 @@ public static void setPreventCornerOverlap(@Nullable View view, boolean preventC
15721574
public static void setCorner(@Nullable View view, float corner) {
15731575
if (view instanceof DynamicButton) {
15741576
((DynamicButton) view).setCorner((int) corner);
1577+
} else if (view instanceof DynamicNavigationView) {
1578+
((DynamicNavigationView) view).setCorner((float) corner);
15751579
} else if (view instanceof DynamicBottomNavigationView) {
15761580
((DynamicBottomNavigationView) view).setCorner((float) corner);
15771581
} else if (view instanceof DynamicNavigationRailView) {
@@ -1600,6 +1604,12 @@ public static void setCorner(@Nullable View view, float corner) {
16001604
public static void setCornerMin(@Nullable View view, float cornerMax) {
16011605
if (view instanceof DynamicButton) {
16021606
setCorner(view, Math.min(((DynamicButton) view).getCorner(), cornerMax));
1607+
} else if (view instanceof DynamicNavigationView) {
1608+
setCorner(view, Math.min(((DynamicNavigationView) view).getCorner(), cornerMax));
1609+
} else if (view instanceof DynamicNavigationRailView) {
1610+
setCorner(view, Math.min(((DynamicNavigationRailView) view).getCorner(), cornerMax));
1611+
} else if (view instanceof DynamicBottomNavigationView) {
1612+
setCorner(view, Math.min(((DynamicBottomNavigationView) view).getCorner(), cornerMax));
16031613
} else if (view instanceof DynamicFloatingActionButton) {
16041614
setCorner(view, Math.min(((DynamicFloatingActionButton) view).getCorner(), cornerMax));
16051615
} else if (view instanceof DynamicCardView) {

dynamic-support/src/main/java/com/pranavpandey/android/dynamic/support/widget/DynamicNavigationView.java

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.pranavpandey.android.dynamic.support.util.DynamicShapeUtils;
4444
import com.pranavpandey.android.dynamic.support.util.DynamicTintUtils;
4545
import com.pranavpandey.android.dynamic.support.widget.base.DynamicBackgroundWidget;
46+
import com.pranavpandey.android.dynamic.support.widget.base.DynamicCornerWidget;
4647
import com.pranavpandey.android.dynamic.support.widget.base.DynamicScrollableWidget;
4748
import com.pranavpandey.android.dynamic.support.widget.base.DynamicStateSelectedWidget;
4849
import com.pranavpandey.android.dynamic.support.widget.base.WindowInsetsWidget;
@@ -57,8 +58,8 @@
5758
* A {@link NavigationView} to apply {@link DynamicTheme} according to the supplied parameters.
5859
*/
5960
public class DynamicNavigationView extends NavigationView
60-
implements WindowInsetsWidget, DynamicBackgroundWidget,
61-
DynamicScrollableWidget, DynamicStateSelectedWidget {
61+
implements WindowInsetsWidget, DynamicBackgroundWidget, DynamicScrollableWidget,
62+
DynamicStateSelectedWidget, DynamicCornerWidget<Float> {
6263

6364
/**
6465
* Color type applied to this view.
@@ -171,6 +172,11 @@ public class DynamicNavigationView extends NavigationView
171172
*/
172173
protected int mContrast;
173174

175+
/**
176+
* Corner size used by this view.
177+
*/
178+
protected float mCornerSize;
179+
174180
public DynamicNavigationView(@NonNull Context context) {
175181
this(context, null);
176182
}
@@ -239,7 +245,7 @@ public void loadFromAttributes(@Nullable AttributeSet attrs) {
239245

240246
if (a.getBoolean(R.styleable.DynamicNavigationView_adt_dynamicCornerSize,
241247
Defaults.ADS_DYNAMIC_CORNER_SIZE)) {
242-
updateBackground();
248+
setCorner((float) DynamicTheme.getInstance().get().getCornerRadius());
243249
}
244250

245251
if (a.getBoolean(
@@ -254,31 +260,6 @@ public void loadFromAttributes(@Nullable AttributeSet attrs) {
254260
initialize();
255261
}
256262

257-
/**
258-
* Update background according to the corner size.
259-
*/
260-
private void updateBackground() {
261-
if (getBackground() instanceof MaterialShapeDrawable) {
262-
MaterialShapeDrawable drawable = (MaterialShapeDrawable) getBackground();
263-
ShapeAppearanceModel.Builder builder =
264-
drawable.getShapeAppearanceModel().toBuilder();
265-
float cornerSize = DynamicTheme.getInstance().get().getCornerRadius();
266-
267-
builder.setTopLeftCornerSize(Theme.Corner.MIN);
268-
builder.setTopRightCornerSize(Theme.Corner.MIN);
269-
270-
if (drawable.getBottomLeftCornerResolvedSize() > 0) {
271-
builder.setBottomLeftCornerSize(cornerSize);
272-
}
273-
274-
if (drawable.getBottomRightCornerResolvedSize() > 0) {
275-
builder.setBottomRightCornerSize(cornerSize);
276-
}
277-
278-
drawable.setShapeAppearanceModel(builder.build());
279-
}
280-
}
281-
282263
@Override
283264
public void initialize() {
284265
if (mBackgroundColorType != Theme.ColorType.NONE
@@ -611,7 +592,37 @@ public void setContrast(int contrast) {
611592
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
612593
super.onSizeChanged(w, h, oldw, oldh);
613594

614-
updateBackground();
595+
Dynamic.setCornerMin(this, Math.min(
596+
getWidth() / Theme.Corner.FACTOR_MAX,
597+
getHeight() / Theme.Corner.FACTOR_MAX));
598+
}
599+
600+
@Override
601+
public @NonNull Float getCorner() {
602+
return mCornerSize;
603+
}
604+
605+
@Override
606+
public void setCorner(@NonNull Float cornerSize) {
607+
this.mCornerSize = cornerSize;
608+
609+
if (getBackground() instanceof MaterialShapeDrawable) {
610+
MaterialShapeDrawable drawable = (MaterialShapeDrawable) getBackground();
611+
ShapeAppearanceModel.Builder builder = drawable.getShapeAppearanceModel().toBuilder();
612+
613+
builder.setTopLeftCornerSize(Theme.Corner.MIN);
614+
builder.setTopRightCornerSize(Theme.Corner.MIN);
615+
616+
if (drawable.getBottomLeftCornerResolvedSize() > 0) {
617+
builder.setBottomLeftCornerSize(cornerSize);
618+
}
619+
620+
if (drawable.getBottomRightCornerResolvedSize() > 0) {
621+
builder.setBottomRightCornerSize(cornerSize);
622+
}
623+
624+
drawable.setShapeAppearanceModel(builder.build());
625+
}
615626
}
616627

617628
@Override

dynamic-support/src/main/res/values/dimens.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
<dimen name="ads_nav_header_spacing">@dimen/ads_margin_medium</dimen>
8080
<dimen name="ads_nav_header_spacing_top">@dimen/ads_margin_medium</dimen>
8181
<dimen name="ads_nav_header_height">160dp</dimen>
82+
<dimen name="ads_nav_corner_size">0dp</dimen>
8283
<dimen name="ads_collapsing_toolbar_height">120dp</dimen>
8384
<dimen name="ads_fab_size">56dp</dimen>
8485
<dimen name="ads_fab_size_mini">40dp</dimen>

dynamic-support/src/main/res/values/styles_v2.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@
361361
<item name="android:textSize">@dimen/ads_font_size_navigation_view</item>
362362
<item name="itemBackground">@null</item>
363363
<item name="itemRippleColor">@null</item>
364+
<item name="drawerLayoutCornerSize">@dimen/ads_nav_corner_size</item>
364365
</style>
365366
<style name="Widget.Dynamic2.NavigationView.ThemeOverlay"
366367
parent="ThemeOverlay.Material3.NavigationView">

0 commit comments

Comments
 (0)