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

Commit fcb7c07

Browse files
committed
actionmode bottombar
1 parent f48e649 commit fcb7c07

File tree

104 files changed

+654
-60
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+654
-60
lines changed

app/src/main/java/de/dlyt/yanndroid/oneuiexample/tabs/IconsTab.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import android.widget.ImageView;
1313
import android.widget.RelativeLayout;
1414
import android.widget.TextView;
15+
import android.widget.Toast;
1516

1617
import androidx.activity.OnBackPressedCallback;
1718
import androidx.annotation.NonNull;
@@ -299,11 +300,12 @@ public void setSelecting(boolean enabled) {
299300

300301
if (enabled) {
301302
mSelecting = true;
302-
imageAdapter.notifyItemRangeChanged(0, imageAdapter.getItemCount()-1);
303-
drawerLayout.showActionMode(true);
303+
imageAdapter.notifyItemRangeChanged(0, imageAdapter.getItemCount() - 1);
304+
drawerLayout.setActionModeBottomMenu(R.menu.action_mode_menu, item -> Toast.makeText(mContext, item.getTitle(), Toast.LENGTH_SHORT).show());
305+
drawerLayout.showActionMode();
304306
drawerLayout.setActionModeSelectAllCheckedChangeListener((buttonView, isChecked) -> {
305307
if (checkAllListening) {
306-
for (int i = 0; i < imageAdapter.getItemCount()-1; i++) {
308+
for (int i = 0; i < imageAdapter.getItemCount() - 1; i++) {
307309
selected.put(i, isChecked);
308310
imageAdapter.notifyItemChanged(i);
309311
}
@@ -318,11 +320,11 @@ public void setSelecting(boolean enabled) {
318320
onBackPressedCallback.setEnabled(true);
319321
} else {
320322
mSelecting = false;
321-
for (int i = 0; i < imageAdapter.getItemCount()-1; i++) selected.put(i, false);
322-
imageAdapter.notifyItemRangeChanged(0, imageAdapter.getItemCount()-1);
323+
for (int i = 0; i < imageAdapter.getItemCount() - 1; i++) selected.put(i, false);
324+
imageAdapter.notifyItemRangeChanged(0, imageAdapter.getItemCount() - 1);
323325

324326
drawerLayout.setActionModeSelectCount(0);
325-
drawerLayout.showActionMode(false);
327+
drawerLayout.dismissActionMode();
326328
tabLayout.setEnabled(true);
327329
bnv.setEnabled(true);
328330
viewPager.setPagingEnabled(true);
@@ -338,7 +340,7 @@ public void toggleItemSelected(int position) {
338340
int count = 0;
339341
for (Boolean b : selected.values()) if (b) count++;
340342
DrawerLayout drawerLayout = getActivity().findViewById(R.id.drawer_view);
341-
drawerLayout.setActionModeSelectAllChecked(count == imageAdapter.getItemCount()-1);
343+
drawerLayout.setActionModeSelectAllChecked(count == imageAdapter.getItemCount() - 1);
342344
drawerLayout.setActionModeSelectCount(count);
343345
checkAllListening = true;
344346
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<menu xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto">
4+
5+
<item
6+
android:id="@+id/move"
7+
android:icon="@drawable/ic_samsung_move"
8+
android:title="Move"
9+
app:showAsAction="always" />
10+
11+
<item
12+
android:id="@+id/delete"
13+
android:icon="@drawable/ic_samsung_delete"
14+
android:title="Delete"
15+
app:showAsAction="always" />
16+
17+
<item
18+
android:id="@+id/add"
19+
android:icon="@drawable/ic_samsung_list_add"
20+
android:title="Add"
21+
app:showAsAction="always" />
22+
23+
<item
24+
android:id="@+id/edit"
25+
android:icon="@drawable/ic_samsung_edit"
26+
android:title="Edit"
27+
app:showAsAction="always" />
28+
29+
<item
30+
android:id="@+id/item1"
31+
android:title="Menu Item 1"
32+
app:showAsAction="never" />
33+
34+
<item
35+
android:id="@+id/item2"
36+
android:title="Menu Item 2"
37+
app:showAsAction="never" />
38+
39+
<item
40+
android:id="@+id/item3"
41+
android:title="Menu Item 3"
42+
app:showAsAction="never" />
43+
44+
</menu>

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/layout/DrawerLayout.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import android.widget.TextView;
2424

2525
import androidx.annotation.IntDef;
26+
import androidx.annotation.MenuRes;
2627
import androidx.annotation.Nullable;
2728
import androidx.appcompat.app.ActionBarDrawerToggle;
2829
import androidx.core.content.ContextCompat;
@@ -246,24 +247,29 @@ public void setDrawerOpen(Boolean open, Boolean animate) {
246247
//
247248
// Action Mode methods
248249
//
249-
public void showActionMode(boolean visible) {
250-
toolbarLayout.showActionMode(visible);
251-
if (visible) {
252-
drawerLayout.setDrawerLockMode(androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
253-
} else {
254-
drawerLayout.setDrawerLockMode(androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED);
255-
}
250+
public void showActionMode() {
251+
toolbarLayout.showActionMode();
252+
drawerLayout.setDrawerLockMode(androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
253+
}
254+
255+
public void setActionModeBottomMenu(@MenuRes int menuRes, ToolbarLayout.OnMenuItemClickListener listener) {
256+
toolbarLayout.setActionModeBottomMenu(menuRes, listener);
257+
}
258+
259+
public void dismissActionMode() {
260+
toolbarLayout.dismissActionMode();
261+
drawerLayout.setDrawerLockMode(androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED);
256262
}
257263

258264
public void setActionModeSelectCount(int count) {
259265
toolbarLayout.setActionModeSelectCount(count);
260266
}
261267

262-
public void setActionModeSelectAllCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener){
268+
public void setActionModeSelectAllCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener) {
263269
toolbarLayout.setActionModeSelectAllCheckedChangeListener(listener);
264270
}
265271

266-
public void setActionModeSelectAllChecked(boolean checked){
272+
public void setActionModeSelectAllChecked(boolean checked) {
267273
toolbarLayout.setActionModeSelectAllChecked(checked);
268274
}
269275

yanndroid/oneui/src/main/java/de/dlyt/yanndroid/oneui/layout/ToolbarLayout.java

Lines changed: 88 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@
5454
import de.dlyt.yanndroid.oneui.sesl.support.ViewSupport;
5555
import de.dlyt.yanndroid.oneui.sesl.support.WindowManagerSupport;
5656
import de.dlyt.yanndroid.oneui.sesl.utils.ReflectUtils;
57+
import de.dlyt.yanndroid.oneui.sesl.widget.ActionModeBottomBarButton;
5758
import de.dlyt.yanndroid.oneui.sesl.widget.PopupListView;
5859
import de.dlyt.yanndroid.oneui.sesl.widget.ToolbarImageButton;
60+
import de.dlyt.yanndroid.oneui.view.PopupMenu;
5961

6062
public class ToolbarLayout extends LinearLayout {
6163
public static final int N_BADGE = -1;
@@ -100,6 +102,10 @@ public class ToolbarLayout extends LinearLayout {
100102
private OnMenuItemClickListener onMenuItemClickListener = item -> {
101103
};
102104

105+
private Menu bottomMenu;
106+
private OnMenuItemClickListener onActionModeItemClickListener = item -> {
107+
};
108+
103109
private boolean mActionMode = false;
104110
private RelativeLayout checkbox_withtext;
105111
private CheckBox checkbox_all;
@@ -138,7 +144,7 @@ public ToolbarLayout(Context context, @Nullable AttributeSet attrs) {
138144
overflowMenuPopupAnchor = findViewById(R.id.toolbar_layout_popup_window_anchor);
139145

140146
mainContainer = findViewById(R.id.toolbar_layout_main_container);
141-
bottomContainer = findViewById(R.id.toolbar_layout_bottom_container);
147+
bottomContainer = findViewById(R.id.toolbar_layout_footer);
142148

143149
checkbox_withtext = findViewById(R.id.checkbox_withtext);
144150
checkbox_all = findViewById(R.id.checkbox_all);
@@ -230,7 +236,7 @@ private void refreshLayout(Configuration newConfig) {
230236

231237
ViewSupport.updateListBothSideMargin(getActivity(), mainContainer);
232238
ViewSupport.updateListBothSideMargin(getActivity(), findViewById(R.id.toolbar_layout_bottom_corners));
233-
ViewSupport.updateListBothSideMargin(getActivity(), findViewById(R.id.toolbar_layout_bottom_container));
239+
ViewSupport.updateListBothSideMargin(getActivity(), findViewById(R.id.toolbar_layout_footer_container));
234240

235241
if (mExpandable) {
236242
resetAppBarHeight();
@@ -318,26 +324,92 @@ public void setCustomTitleView(View view, SamsungCollapsingToolbarLayout.LayoutP
318324
//
319325
// Action Mode methods
320326
//
321-
public void showActionMode(boolean visible) {
322-
mActionMode = visible;
323-
setNavigationButtonVisible(!visible);
324-
if (visible) {
325-
checkbox_withtext.setVisibility(View.VISIBLE);
326-
setActionModeSelectCount(0);
327-
overflowButton.setVisibility(GONE);
328-
actionButtonContainer.setVisibility(GONE);
329-
} else {
330-
checkbox_withtext.setVisibility(View.GONE);
331-
setTitle(mTitle);
332-
overflowButton.setVisibility(VISIBLE);
333-
actionButtonContainer.setVisibility(VISIBLE);
327+
public void showActionMode() {
328+
mActionMode = true;
329+
setNavigationButtonVisible(false);
330+
checkbox_withtext.setVisibility(View.VISIBLE);
331+
setActionModeSelectCount(0);
332+
overflowButton.setVisibility(GONE);
333+
actionButtonContainer.setVisibility(GONE);
334+
335+
if (bottomMenu != null) {
336+
bottomContainer.setVisibility(GONE);
337+
findViewById(R.id.toolbar_layout_footer_action_mode).setVisibility(VISIBLE);
334338
}
335339
}
336340

341+
@SuppressLint("RestrictedApi")
342+
public void setActionModeBottomMenu(@MenuRes int menuRes, OnMenuItemClickListener listener) {
343+
LinearLayout footer_action_mode = findViewById(R.id.toolbar_layout_footer_action_mode);
344+
footer_action_mode.removeAllViews();
345+
346+
onActionModeItemClickListener = listener;
347+
348+
bottomMenu = new MenuBuilder(getContext());
349+
MenuInflater menuInflater = new SupportMenuInflater(getContext());
350+
menuInflater.inflate(menuRes, bottomMenu);
351+
352+
ArrayList<MenuItem> bottomItems = new ArrayList<>();
353+
354+
for (int i = 0; i < bottomMenu.size(); i++) {
355+
MenuItem item = bottomMenu.getItem(i);
356+
if (((MenuItemImpl) item).requiresActionButton()) {
357+
ActionModeBottomBarButton button = new ActionModeBottomBarButton(mContext);
358+
button.setText(item.getTitle());
359+
button.setIcon(item.getIcon());
360+
button.setOnClickListener(v -> {
361+
onActionModeItemClickListener.onMenuItemClick(item);
362+
});
363+
footer_action_mode.addView(button);
364+
} else {
365+
bottomItems.add(item);
366+
}
367+
}
368+
369+
if (!bottomItems.isEmpty()) {
370+
ActionModeBottomBarButton button = new ActionModeBottomBarButton(mContext);
371+
button.setText(getResources().getString(R.string.sesl_more_item_label));
372+
button.setIcon(getResources().getDrawable(R.drawable.ic_samsung_more, getContext().getTheme()));
373+
footer_action_mode.addView(button);
374+
375+
PopupMenu popupMenu = new PopupMenu(button);
376+
popupMenu.inflate(bottomItems);
377+
popupMenu.setOnMenuItemClickListener(item -> {
378+
popupMenu.dismiss();
379+
onActionModeItemClickListener.onMenuItemClick(item);
380+
});
381+
382+
button.setOnClickListener(v -> {
383+
popupMenu.show();
384+
});
385+
386+
}
387+
388+
}
389+
390+
public Menu getActionModeBottomMenu() {
391+
return bottomMenu;
392+
}
393+
394+
public void dismissActionMode() {
395+
mActionMode = false;
396+
setNavigationButtonVisible(true);
397+
checkbox_withtext.setVisibility(View.GONE);
398+
setTitle(mTitle);
399+
overflowButton.setVisibility(VISIBLE);
400+
actionButtonContainer.setVisibility(VISIBLE);
401+
402+
bottomContainer.setVisibility(VISIBLE);
403+
findViewById(R.id.toolbar_layout_footer_action_mode).setVisibility(GONE);
404+
}
405+
337406
public void setActionModeSelectCount(int count) {
338-
String title = getResources().getString(R.string.selected_check_info, count);
407+
String title = count > 0 ? getResources().getString(R.string.selected_check_info, count) : getResources().getString(R.string.settings_import_select_items);
339408
if (mExpandable) collapsingToolbarLayout.setTitle(title);
340409
collapsedTitleView.setText(title);
410+
411+
if (bottomMenu != null)
412+
findViewById(R.id.toolbar_layout_footer_action_mode).setVisibility(count > 0 ? VISIBLE : GONE);
341413
}
342414

343415
public void setActionModeSelectAllCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener) {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package de.dlyt.yanndroid.oneui.sesl.widget;
2+
3+
import android.content.Context;
4+
import android.graphics.drawable.Drawable;
5+
import android.text.TextUtils;
6+
import android.util.TypedValue;
7+
import android.view.Gravity;
8+
import android.widget.ImageView;
9+
import android.widget.LinearLayout;
10+
import android.widget.TextView;
11+
12+
import androidx.core.content.ContextCompat;
13+
14+
import de.dlyt.yanndroid.oneui.R;
15+
16+
public class ActionModeBottomBarButton extends LinearLayout {
17+
18+
private ImageView icon;
19+
private TextView textView;
20+
21+
public ActionModeBottomBarButton(Context context) {
22+
super(context);
23+
24+
int hMargin = (int) getResources().getDimension(R.dimen.bottom_bar_item_spacing);
25+
LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
26+
containerParams.setMargins(hMargin, 0, hMargin, 0);
27+
setLayoutParams(containerParams);
28+
setBackgroundResource(R.drawable.ripple_light_view_rectangle_bottomitem);
29+
setOrientation(LinearLayout.VERTICAL);
30+
setGravity(Gravity.CENTER);
31+
32+
icon = new ImageView(getContext());
33+
int iconSize = (int) getResources().getDimension(R.dimen.bottom_bar_item_image_size);
34+
LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams(iconSize, iconSize);
35+
containerParams.setMargins(0, 0, 0, 1);
36+
icon.setLayoutParams(iconParams);
37+
icon.setColorFilter(ContextCompat.getColor(getContext(), R.color.bottom_bar_item_image_color), android.graphics.PorterDuff.Mode.SRC_IN);
38+
addView(icon);
39+
40+
textView = new TextView(getContext());
41+
textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
42+
textView.setGravity(Gravity.CENTER);
43+
textView.setEllipsize(TextUtils.TruncateAt.END);
44+
textView.setMaxLines(1);
45+
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.bottom_bar_item_text_size));
46+
textView.setTextColor(ContextCompat.getColor(getContext(), R.color.bottom_bar_item_text_color));
47+
addView(textView);
48+
}
49+
50+
public void setText(CharSequence text) {
51+
this.textView.setText(text);
52+
}
53+
54+
public void setIcon(Drawable icon) {
55+
this.icon.setImageDrawable(icon);
56+
}
57+
58+
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public Menu getMenu() {
6565
}
6666

6767
@SuppressLint("RestrictedApi")
68-
public void inflate(@MenuRes int menuRes){
68+
public void inflate(@MenuRes int menuRes) {
6969
menu = new MenuBuilder(context);
7070
MenuInflater menuInflater = new SupportMenuInflater(context);
7171
menuInflater.inflate(menuRes, menu);
@@ -77,7 +77,10 @@ public void inflate(@MenuRes int menuRes){
7777
overflowBadges.put(item, 0);
7878
menuItems.add(item);
7979
}
80+
inflate(menuItems);
81+
}
8082

83+
public void inflate(ArrayList<MenuItem> menuItems) {
8184
if (menuItems.isEmpty()) return;
8285

8386
if (popupWindow != null) {
@@ -148,7 +151,7 @@ public void dismiss() {
148151
popupWindow.dismiss();
149152
}
150153

151-
public boolean isShowing(){
154+
public boolean isShowing() {
152155
return popupWindow.isShowing();
153156
}
154157

@@ -222,6 +225,8 @@ public View getView(int index, View view, ViewGroup parent) {
222225
badgeIcon = view.findViewById(R.id.more_menu_popup_badge);
223226
Integer badgeCount = overflowBadges.get(overflowItems.get(index));
224227

228+
if (badgeCount == null) return view;
229+
225230
if (badgeCount > 0) {
226231
int count = badgeCount;
227232
if (count > 99) {

0 commit comments

Comments
 (0)