Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit 22a286d

Browse files
authored
app/PopupMenu: add Group Divider (#64)
* app/SMultiWindow: fix compile warnings Signed-off-by: BlackMesa123 <[email protected]> * app/PopupMenu: add Group Divider PopupMenu.setGroupDividerEnabled(boolean) Signed-off-by: BlackMesa123 <[email protected]> * app/Spinner: OneUI4 text size Signed-off-by: BlackMesa123 <[email protected]>
1 parent 9b9aad7 commit 22a286d

File tree

13 files changed

+241
-83
lines changed

13 files changed

+241
-83
lines changed

app/src/main/java/de/dlyt/yanndroid/oneuiexample/MainActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ public void onClick(View v) {
379379
private void popupView(View view) {
380380
if (bnvPopupMenu == null) {
381381
bnvPopupMenu = new PopupMenu(view);
382+
bnvPopupMenu.setGroupDividerEnabled(true);
382383
bnvPopupMenu.inflate(R.menu.bnv_menu);
383384
bnvPopupMenu.setPopupMenuListener(new PopupMenu.PopupMenuListener() {
384385
@Override

app/src/main/res/menu/bnv_menu.xml

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,6 @@
2020
</menu>
2121
</item>
2222

23-
<group android:id="@+id/group1">
24-
<item
25-
android:id="@+id/gitem1"
26-
android:title="GroupItem 1" />
27-
<item
28-
android:id="@+id/gitem2"
29-
android:title="GroupItem 2" />
30-
</group>
31-
3223
<item
3324
android:id="@+id/item2"
3425
android:enabled="false"
@@ -41,12 +32,16 @@
4132

4233
<item
4334
android:id="@+id/item4"
44-
android:title="MenuItem 4"
45-
android:visible="false" />
46-
47-
<item
48-
android:id="@+id/item5"
49-
android:title="MenuItem 5" />
35+
android:title="MenuItem 4" />
5036

37+
<group
38+
android:id="@+id/group1">
39+
<item
40+
android:id="@+id/gitem1"
41+
android:title="GroupItem 1" />
42+
<item
43+
android:id="@+id/gitem2"
44+
android:title="GroupItem 2" />
45+
</group>
5146

5247
</menu>

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/menu/PopupMenu.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public class PopupMenu {
3737
private LinearLayout layoutWithTitle;
3838
private CharSequence title;
3939

40+
private boolean mGroupDividerEnabled;
41+
42+
private int lastGroupId = 0;
4043
private int xoff = 0;
4144
private int yoff = 0;
4245

@@ -84,15 +87,16 @@ public void inflate(Menu menu, CharSequence title) {
8487
}
8588

8689
itemViews = new ArrayList<>();
87-
for (MenuItem menuItem : menu.menuItems)
88-
itemViews.add(new PopupMenuItemView(context, menuItem));
90+
for (MenuItem menuItem : menu.menuItems) {
91+
itemViews.add(new PopupMenuItemView(context, menuItem, shouldShowGroupDivider(menuItem)));
92+
}
8993

9094
popupMenuAdapter = new PopupMenuAdapter();
9195
listView = new PopupListView(context);
9296
listView.setAdapter(popupMenuAdapter);
9397
listView.setMaxHeight(context.getResources().getDimensionPixelSize(R.dimen.sesl_menu_popup_max_height));
9498
listView.setDivider(null);
95-
listView.setSelector(context.getResources().getDrawable(mIsOneUI4 ? R.drawable.sesl4_list_selector : R.drawable.sesl_list_selector, context.getTheme()));
99+
listView.setSelector(context.getResources().getDrawable(android.R.color.transparent));
96100
listView.setOnItemClickListener((parent, view, position, id) -> {
97101
MenuItem clickedMenuItem = menu.getItem(position);
98102
if (clickedMenuItem.isCheckable()) clickedMenuItem.toggleChecked();
@@ -170,6 +174,20 @@ private TextView createTitleView() {
170174
return titleView;
171175
}
172176

177+
private boolean shouldShowGroupDivider(MenuItem menuItem) {
178+
if (mGroupDividerEnabled) {
179+
if (menuItem.getGroupId() == lastGroupId) {
180+
return false;
181+
} else {
182+
boolean showDivider = lastGroupId != 0 || menuItem.getGroupId() != 0;
183+
lastGroupId = menuItem.getGroupId();
184+
return showDivider;
185+
}
186+
} else {
187+
return false;
188+
}
189+
}
190+
173191
public int getPopupMenuWidth() {
174192
int makeMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
175193
int popupWidth = 0;
@@ -211,6 +229,17 @@ public void show(int xoff, int yoff) {
211229
((View) ReflectUtils.genericGetField(popupWindow, "mBackgroundView")).setClipToOutline(true);
212230
}
213231

232+
public void setGroupDividerEnabled(boolean enabled) {
233+
mGroupDividerEnabled = enabled;
234+
235+
if (itemViews != null) {
236+
for (int i = 0; i < itemViews.size(); i++) {
237+
PopupMenuItemView itemView = itemViews.get(i);
238+
itemView.setGroupDividerEnabled(shouldShowGroupDivider(itemView.getMenuItem()));
239+
}
240+
}
241+
}
242+
214243
public void dismiss() {
215244
popupWindow.dismiss();
216245
}

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/menu/PopupMenuItemView.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Locale;
1313

1414
import de.dlyt.yanndroid.oneui.R;
15+
import de.dlyt.yanndroid.oneui.menu.widget.MenuDivider;
1516

1617
class PopupMenuItemView extends LinearLayout {
1718

@@ -23,38 +24,55 @@ class PopupMenuItemView extends LinearLayout {
2324
private MenuItem menuItem;
2425
private LinearLayout containerView;
2526

27+
private MenuDivider menuDivider;
28+
29+
private LinearLayout contentView;
2630
private ImageView iconView;
2731
private TextView titleView;
2832

2933
private TextView badgeView;
3034
private CheckBox checkBox;
3135
private ImageView arrowView;
3236

33-
PopupMenuItemView(Context context, MenuItem menuItem) {
37+
private boolean mGroupDividerEnabled;
38+
39+
PopupMenuItemView(Context context, MenuItem menuItem, boolean groupDividerEnabled) {
3440
super(context);
3541
this.context = context;
3642
this.menuItem = menuItem;
43+
mGroupDividerEnabled = groupDividerEnabled;
3744

3845
mIsOneUI4 = context.getTheme().obtainStyledAttributes(new int[]{R.attr.isOneUI4}).getBoolean(0, false);
3946

4047
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
4148
inflater.inflate(R.layout.menu_item_popup_item, this, true);
4249

4350
containerView = findViewById(R.id.menu_item_container);
51+
menuDivider = findViewById(R.id.menu_group_divider);
52+
contentView = findViewById(R.id.menu_item_content);
53+
contentView.setBackground(context.getResources().getDrawable(mIsOneUI4 ? R.drawable.sesl4_list_selector : R.drawable.sesl_list_selector, context.getTheme()));
4454
iconView = findViewById(R.id.menu_item_icon);
4555
titleView = findViewById(R.id.menu_item_title);
56+
titleView.setTextSize(0, context.getResources().getDimension(mIsOneUI4 ? R.dimen.sesl4_popup_menu_item_text_size : R.dimen.sesl_popup_menu_item_text_size));
4657
badgeView = findViewById(R.id.menu_item_badge);
4758
checkBox = findViewById(R.id.menu_item_check_box);
4859
arrowView = findViewById(R.id.menu_item_arrow);
4960
if (getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)
5061
arrowView.setImageResource(R.drawable.ic_samsung_arrow_left);
5162

52-
titleView.setTextSize(0, context.getResources().getDimension(mIsOneUI4 ? R.dimen.sesl4_popup_menu_item_text_size : R.dimen.sesl_popup_menu_item_text_size));
63+
updateView();
64+
}
65+
66+
MenuItem getMenuItem() {
67+
return menuItem;
68+
}
5369

70+
void setGroupDividerEnabled(boolean enabled) {
71+
mGroupDividerEnabled = enabled;
5472
updateView();
5573
}
5674

57-
public void updateView() {
75+
void updateView() {
5876
//visible state
5977
containerView.setVisibility(menuItem.isVisible() ? VISIBLE : GONE);
6078

@@ -68,6 +86,9 @@ public void updateView() {
6886
arrowView.setEnabled(enabled);
6987
setClickable(!enabled);
7088

89+
//divider
90+
menuDivider.setVisibility(mGroupDividerEnabled ? VISIBLE : GONE);
91+
7192
//icon
7293
iconView.setVisibility(menuItem.getIcon() == null ? GONE : VISIBLE);
7394
iconView.setImageDrawable(menuItem.getIcon());
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package de.dlyt.yanndroid.oneui.menu.widget;
2+
3+
import android.content.Context;
4+
import android.graphics.Canvas;
5+
import android.graphics.Paint;
6+
import android.util.AttributeSet;
7+
import android.util.DisplayMetrics;
8+
import android.util.TypedValue;
9+
import android.widget.ImageView;
10+
11+
import androidx.annotation.Nullable;
12+
13+
import de.dlyt.yanndroid.oneui.R;
14+
15+
public class MenuDivider extends ImageView {
16+
private static final float CIRCLE_INTERVAL = 3.0f;
17+
private static final float DIAMETER_SIZE = 1.5f;
18+
private final int mDiameter;
19+
private final int mInterval;
20+
private Paint mPaint;
21+
22+
public MenuDivider(Context context) {
23+
this(context, null);
24+
}
25+
26+
public MenuDivider(Context context, @Nullable AttributeSet attrs) {
27+
this(context, attrs, 0);
28+
}
29+
30+
public MenuDivider(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
31+
super(context, attrs, defStyleAttr);
32+
33+
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
34+
mDiameter = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DIAMETER_SIZE, displayMetrics);
35+
mInterval = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CIRCLE_INTERVAL, displayMetrics);
36+
37+
mPaint = new Paint();
38+
mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
39+
mPaint.setColor(getResources().getColor(R.color.sesl_popup_menu_divider_color));
40+
}
41+
42+
@Override
43+
protected void onDraw(Canvas canvas) {
44+
super.onDraw(canvas);
45+
46+
// kang from androidx.appcompat.widget.SeslMenuDivider
47+
int i;
48+
int i2;
49+
int width = (getWidth() - getPaddingStart()) - getPaddingEnd();
50+
int height = getHeight();
51+
int i3 = this.mDiameter;
52+
int i4 = ((width - i3) / (this.mInterval + i3)) + 1;
53+
int i5 = i4 - 1;
54+
int paddingStart = ((int) ((((float) i3) / 2.0f) + 0.5f)) + getPaddingStart();
55+
int i6 = this.mDiameter;
56+
int i7 = (width - i6) - ((this.mInterval + i6) * i5);
57+
if (i6 % 2 != 0) {
58+
i7--;
59+
}
60+
if (i5 > 0) {
61+
i = i7 / i5;
62+
i2 = i7 % i5;
63+
} else {
64+
i2 = 0;
65+
i = 0;
66+
}
67+
int i8 = 0;
68+
for (int i9 = 0; i9 < i4; i9++) {
69+
canvas.drawCircle((float) (paddingStart + i8), (float) (height / 2), ((float) this.mDiameter) / 2.0f, this.mPaint);
70+
i8 += this.mDiameter + this.mInterval + i;
71+
if (i9 < i2) {
72+
i8++;
73+
}
74+
}
75+
}
76+
}

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/sesl/sdk/multiwindow/SMultiWindow.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ private void initMultiWindowFeature() {
7878
try {
7979
if (!enableQueried) {
8080
enableQueried = true;
81-
Context context = mMultiWindowReflator.checkMethod("getApplication") ? (Context) mMultiWindowReflator.invoke("getApplication", null) : null;
81+
Context context = mMultiWindowReflator.checkMethod("getApplication") ? (Context) mMultiWindowReflator.invoke("getApplication", (Object[]) null) : null;
8282
if (context == null && mMultiWindowReflator.checkMethod("getSystemContext")) {
83-
context = (Context) mMultiWindowReflator.invoke("getSystemContext", null);
83+
context = (Context) mMultiWindowReflator.invoke("getSystemContext", (Object[]) null);
8484
}
8585
if (context != null && (packageManager = context.getPackageManager()) != null) {
8686
isMultiWindowEnabled = packageManager.hasSystemFeature(SMultiWindowReflator.PackageManager.FEATURE_MULTIWINDOW);

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/sesl/sdk/multiwindow/SMultiWindowActivity.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private boolean checkOption(int option) {
114114

115115
private void updateWindowMode() {
116116
Object invoke;
117-
if (mMultiWindow.isFeatureEnabled(SMultiWindow.MULTIWINDOW) && (invoke = mMultiWindowReflator.invoke("getWindowMode", null)) != null) {
117+
if (mMultiWindow.isFeatureEnabled(SMultiWindow.MULTIWINDOW) && (invoke = mMultiWindowReflator.invoke("getWindowMode", (Object[]) null)) != null) {
118118
mWindowMode = (Integer) invoke;
119119
}
120120
}
@@ -126,7 +126,7 @@ private void setWindowMode() {
126126
}
127127

128128
private Bundle getWindowInfo() {
129-
return (Bundle) mMultiWindowReflator.invoke("getWindowInfo", null);
129+
return (Bundle) mMultiWindowReflator.invoke("getWindowInfo", (Object[]) null);
130130
}
131131

132132
private Rect getLastSize() {
@@ -136,7 +136,7 @@ private Rect getLastSize() {
136136
}
137137

138138
private Object getMultiPhoneWindowEvent() {
139-
return mMultiWindowReflator.invoke("getMultiPhoneWindowEvent", null);
139+
return mMultiWindowReflator.invoke("getMultiPhoneWindowEvent", (Object[]) null);
140140
}
141141

142142
public boolean isNormalWindow() {
@@ -251,7 +251,7 @@ public PointF getScaleInfo() {
251251
if (!mMultiWindow.isFeatureEnabled(SMultiWindow.FREE_STYLE)) {
252252
return new PointF(1.0f, 1.0f);
253253
}
254-
return (PointF) mMultiWindowReflator.invoke("getScaleInfo", null);
254+
return (PointF) mMultiWindowReflator.invoke("getScaleInfo", (Object[]) null);
255255
}
256256

257257
public boolean setStateChangeListener(StateChangeListener listener) {
@@ -260,7 +260,7 @@ public boolean setStateChangeListener(StateChangeListener listener) {
260260
}
261261
mStateChangeListener = listener;
262262
if (mStateChangeListener == null) {
263-
mMultiWindowReflator.invoke("setStateChangeListener", null);
263+
mMultiWindowReflator.invoke("setStateChangeListener", (Object[]) null);
264264
} else {
265265
mMultiWindowReflator.invoke("setStateChangeListener", new SMultiWindowActivity.StateChangeListener() {
266266
public void onModeChanged(boolean z) {

0 commit comments

Comments
 (0)