Implement new preference screen "Customize menu" (#31172)

The custom menu item preference screen follows the Figma design and is composed by two sections, Main menu and Page actions.

The screen shows only those items that are supported by the device, items that will never appear won't be shown.
Each item's visibility will default to true and each preference is saved on shared preferences.

The only two items whose visibility cannot be modified are the Main Settings item and the Custom Menu item itself.
This commit is contained in:
Simone Arpe
2025-09-16 13:54:29 +02:00
committed by GitHub
parent 3455db6122
commit 673b2e1833
20 changed files with 1947 additions and 0 deletions
@@ -64,6 +64,9 @@ public final class BravePreferenceKeys {
public static final String BRAVE_LEO_AUTOCOMPLETE =
"org.chromium.chrome.browser.Brave_Leo_AutoComplete";
public static final String CUSTOMIZABLE_BRAVE_MENU_ITEM_ID_FORMAT =
"customizable_brave_menu_item_id_%s";
// Playlist preference keys
public static final String PREF_ENABLE_PLAYLIST = "enable_playlist";
public static final String PREF_ADD_TO_PLAYLIST_BUTTON = "add_to_playlist_button";
@@ -75,6 +75,7 @@ import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.UnownedUserDataSupplier;
import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;
import org.chromium.brave.browser.customize_menu.CustomizeBraveMenu;
import org.chromium.brave.browser.quick_search_engines.settings.QuickSearchEnginesCallback;
import org.chromium.brave.browser.quick_search_engines.settings.QuickSearchEnginesFragment;
import org.chromium.brave.browser.quick_search_engines.settings.QuickSearchEnginesModel;
@@ -182,6 +183,7 @@ import org.chromium.chrome.browser.speedreader.BraveSpeedReaderUtils;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.browser.tabbed_mode.BraveTabbedAppMenuPropertiesDelegate;
import org.chromium.chrome.browser.tabmodel.TabClosureParams;
import org.chromium.chrome.browser.tabmodel.TabList;
import org.chromium.chrome.browser.tabmodel.TabModel;
@@ -190,6 +192,7 @@ import org.chromium.chrome.browser.toolbar.BraveToolbarManager;
import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarConfiguration;
import org.chromium.chrome.browser.toolbar.top.BraveToolbarLayoutImpl;
import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate;
import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarController;
@@ -445,6 +448,24 @@ public abstract class BraveActivity extends ChromeActivity
return true;
} else if (id == R.id.reload_menu_id) {
setComesFromNewTab(true);
} else if (id == R.id.preferences_id) {
final AppMenuPropertiesDelegate delegate = createAppMenuPropertiesDelegate();
assert delegate instanceof BraveTabbedAppMenuPropertiesDelegate;
final BraveTabbedAppMenuPropertiesDelegate braveTabbedAppMenuPropertiesDelegate =
(BraveTabbedAppMenuPropertiesDelegate) delegate;
final Bundle bundle =
CustomizeBraveMenu.populateBundle(
getResources(),
new Bundle(),
braveTabbedAppMenuPropertiesDelegate.buildMainMenuModelList(),
braveTabbedAppMenuPropertiesDelegate.buildPageActionsModelList());
SettingsNavigation settingsNavigation =
SettingsNavigationFactory.createSettingsNavigation();
// Follow upstream code and pass null as fragment to show
// that defaults to main settings screen.
settingsNavigation.startSettings(this, null, bundle);
return true;
}
if (super.onMenuOrKeyboardAction(id, fromMenu, triggeringMotion)) {
@@ -503,6 +524,16 @@ public abstract class BraveActivity extends ChromeActivity
enableSpeedreaderMode();
} else if (id == R.id.brave_leo_id) {
openBraveLeo();
} else if (id == CustomizeBraveMenu.BRAVE_CUSTOMIZE_ITEM_ID) {
final AppMenuPropertiesDelegate delegate = createAppMenuPropertiesDelegate();
assert delegate instanceof BraveTabbedAppMenuPropertiesDelegate;
final BraveTabbedAppMenuPropertiesDelegate braveTabbedAppMenuPropertiesDelegate =
(BraveTabbedAppMenuPropertiesDelegate) delegate;
// Get full menu items and pass them to settings.
CustomizeBraveMenu.openCustomizeMenuSettings(
this,
braveTabbedAppMenuPropertiesDelegate.buildMainMenuModelList(),
braveTabbedAppMenuPropertiesDelegate.buildPageActionsModelList());
} else {
return false;
}
@@ -16,6 +16,7 @@ import org.chromium.base.BravePreferenceKeys;
import org.chromium.base.ContextUtils;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.brave.browser.customize_menu.CustomizeBraveMenu;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveFeatureUtil;
import org.chromium.chrome.browser.BraveRelaunchUtils;
@@ -55,6 +56,7 @@ public class AppearancePreferences extends BravePreferenceFragment
public static final String PREF_SHOW_UNDO_WHEN_TABS_CLOSED = "show_undo_when_tabs_closed";
public static final String PREF_ADDRESS_BAR = "address_bar";
public static final String PREF_TOOLBAR_SHORTCUT = "toolbar_shortcut";
private static final String PREF_BRAVE_CUSTOMIZE_MENU = "brave_customize_menu";
private BraveRewardsNativeWorker mBraveRewardsNativeWorker;
@@ -65,6 +67,11 @@ public class AppearancePreferences extends BravePreferenceFragment
super.onCreate(savedInstanceState);
mPageTitle.set(getString(R.string.prefs_appearance));
SettingsUtils.addPreferencesFromResource(this, R.xml.brave_appearance_preferences);
// Forward the custom menu item keys from appearance to custom menu item preference screen.
CustomizeBraveMenu.propagateMenuItemExtras(
findPreference(PREF_BRAVE_CUSTOMIZE_MENU), getArguments());
boolean isTablet =
DeviceFormFactor.isNonMultiDisplayContextOnTablet(
ContextUtils.getApplicationContext());
@@ -18,6 +18,7 @@ import org.chromium.base.BraveFeatureList;
import org.chromium.base.ContextUtils;
import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;
import org.chromium.brave.browser.customize_menu.CustomizeBraveMenu;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
import org.chromium.chrome.R;
@@ -115,6 +116,9 @@ public abstract class BraveMainPreferencesBase extends BravePreferenceFragment
// onCreate().
SettingsUtils.addPreferencesFromResource(this, R.xml.brave_main_preferences);
// Forward the custom menu item keys from main settings to appearance preference screen.
CustomizeBraveMenu.propagateMenuItemExtras(findPreference(PREF_APPEARANCE), getArguments());
initBraveAccount();
overrideChromiumPreferences();
initRateBrave();
@@ -23,9 +23,11 @@ import androidx.core.graphics.drawable.DrawableCompat;
import org.chromium.base.BraveFeatureList;
import org.chromium.base.BravePreferenceKeys;
import org.chromium.base.BuildInfo;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.base.supplier.Supplier;
import org.chromium.brave.browser.customize_menu.CustomizeBraveMenu;
import org.chromium.brave_vpn.mojom.BraveVpnConstants;
import org.chromium.build.annotations.NullMarked;
import org.chromium.chrome.R;
@@ -37,10 +39,12 @@ import org.chromium.chrome.browser.brave_leo.BraveLeoPrefUtils;
import org.chromium.chrome.browser.feed.webfeed.WebFeedSnackbarController;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.incognito.IncognitoUtils;
import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController;
import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.multiwindow.BraveMultiWindowUtils;
import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.preferences.BravePref;
import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.readaloud.ReadAloudController;
@@ -48,6 +52,7 @@ import org.chromium.chrome.browser.set_default_browser.BraveSetDefaultBrowserUti
import org.chromium.chrome.browser.speedreader.BraveSpeedReaderUtils;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tinker_tank.TinkerTankDelegate;
import org.chromium.chrome.browser.toolbar.ToolbarManager;
import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarConfiguration;
import org.chromium.chrome.browser.toolbar.menu_button.BraveMenuButtonCoordinator;
@@ -60,8 +65,10 @@ import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils;
import org.chromium.chrome.browser.vpn.utils.BraveVpnProfileUtils;
import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils;
import org.chromium.components.dom_distiller.core.DomDistillerFeatures;
import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.components.webapps.WebappsUtils;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modelutil.MVCListAdapter;
import org.chromium.ui.modelutil.PropertyModel;
@@ -245,6 +252,367 @@ public class BraveTabbedAppMenuPropertiesDelegate extends TabbedAppMenuPropertie
&& super.shouldShowMoveToOtherWindow();
}
/**
* Builds the complete list of main menu items for the Customize menu settings screen.
*
* <p>This method creates a comprehensive list of all available main menu items that users can
* customize through the menu settings. The list includes items like "New Tab", "History",
* "Downloads", "Brave Wallet", etc., based on feature availability and device configuration.
*
* <p><strong>Note on Icons:</strong> The returned menu items do not include drawable icons
* because {@link android.graphics.drawable.Drawable} objects cannot be parceled across activity
* boundaries. Instead, the settings screen uses {@link
* CustomizeBraveMenu#getDrawableResFromMenuItemId(int)} to map menu item IDs to their
* corresponding drawable resource IDs for display.
*
* @return a ModelList containing all customizable main menu items with their IDs and titles
*/
public MVCListAdapter.ModelList buildMainMenuModelList() {
MVCListAdapter.ModelList modelList = new MVCListAdapter.ModelList();
// New Tab
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.new_tab_menu_id, R.string.menu_new_tab, 0)));
// New Incognito Tab
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.new_incognito_tab_menu_id,
R.string.menu_new_incognito_tab,
0)));
// Add to Group
if (ChromeFeatureList.sTabGroupParityBottomSheetAndroid.isEnabled()) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.add_to_group_menu_id, R.string.menu_add_tab_to_group, 0)));
}
if (ChromeFeatureList.sAndroidPinnedTabs.isEnabled()) {
// Pin
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.pin_tab_menu_id, R.string.menu_pin_tab, 0)));
// Unpin
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.unpin_tab_menu_id, R.string.menu_unpin_tab, 0)));
}
// New Window
if (!BuildInfo.getInstance().isAutomotive) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.new_window_menu_id, R.string.menu_new_window, 0)));
}
// New Incognito Window
if (IncognitoUtils.shouldOpenIncognitoAsWindow() && !BuildInfo.getInstance().isAutomotive) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.new_incognito_window_menu_id,
R.string.menu_new_incognito_window,
0)));
}
// Move to other window
if (MultiWindowUtils.instanceSwitcherEnabled()
&& MultiWindowUtils.isMultiInstanceApi31Enabled()
&& !BuildInfo.getInstance().isAutomotive) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.move_to_other_window_menu_id,
R.string.menu_move_to_other_window,
0)));
}
// Manage windows
// Remove the windows count placeholder.
String manageWindows =
mContext.getString(R.string.menu_manage_all_windows, 0)
.replaceAll("\\s*\\(\\d+\\)$", "");
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildBaseModelForTextItem(R.id.manage_all_windows_menu_id)
.with(AppMenuItemProperties.TITLE, manageWindows)
.build()));
// Open History
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.open_history_menu_id, R.string.menu_history, 0)));
// Tinker Tank
if (TinkerTankDelegate.isEnabled()) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.tinker_tank_menu_id, R.string.menu_tinker_tank, 0)));
}
// Downloads
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.downloads_menu_id, R.string.menu_downloads, 0)));
// Bookmarks
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.all_bookmarks_menu_id, R.string.menu_bookmarks, 0)));
// Recent Tabs
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.recent_tabs_menu_id, R.string.menu_recent_tabs, 0)));
// Add Brave specific items.
if (ChromeFeatureList.isEnabled(BraveFeatureList.NATIVE_BRAVE_WALLET)) {
modelList.add(buildBraveWalletItem());
}
if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_PLAYLIST)) {
modelList.add(buildBravePlaylistItem());
modelList.add(buildBraveAddToPlaylistItem());
}
if (BraveLeoPrefUtils.isLeoEnabled()) {
modelList.add(buildBraveLeoItem());
}
if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_SPEEDREADER)) {
modelList.add(buildBraveSpeedreaderItem());
}
modelList.add(buildSetDefaultBrowserItem());
if (BraveVpnUtils.isVpnFeatureSupported(mContext)) {
modelList.add(buildBraveVpnItem());
if (BraveVpnPrefUtils.isSubscriptionPurchase()
&& !TextUtils.isEmpty(BraveVpnPrefUtils.getRegionIsoCode())) {
modelList.add(buildBraveVpnLocationIconItem());
}
}
BraveRewardsNativeWorker braveRewardsNativeWorker = BraveRewardsNativeWorker.getInstance();
if (braveRewardsNativeWorker != null && braveRewardsNativeWorker.isSupported()) {
modelList.add(buildBraveRewardsItem());
}
modelList.add(buildBraveNewsItem());
modelList.add(buildExitItem());
return modelList;
}
/**
* Builds the complete list of page action items for the Customize menu settings screen.
*
* <p>This method creates a comprehensive list of all available page action menu items that
* users can customize through the menu settings. Page actions are context-sensitive menu items
* that operate on the current page, such as "Share", "Download Page", "Print", "Find in Page",
* "Translate", etc., based on feature availability and current page context.
*
* <p><strong>Note on Icons:</strong> The returned menu items do not include drawable icons
* because {@link android.graphics.drawable.Drawable} objects cannot be parceled across activity
* boundaries. Instead, the settings screen uses {@link
* CustomizeBraveMenu#getDrawableResFromMenuItemId(int)} to map menu item IDs to their
* corresponding drawable resource IDs for display.
*
* @return a ModelList containing all customizable page action menu items with their IDs and
* titles
*/
public MVCListAdapter.ModelList buildPageActionsModelList() {
// Page Zoom
final MVCListAdapter.ModelList modelList = new MVCListAdapter.ModelList();
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.page_zoom_id, R.string.page_zoom_menu_title, 0)));
// Share
if (mIsTablet) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.share_menu_id, R.string.menu_share_page, 0)));
}
// Download Page
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.download_page_id, R.string.menu_download_page, 0)));
// Print
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(R.id.print_id, R.string.menu_print, 0)));
// Price Tracking enable
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.enable_price_tracking_menu_id,
R.string.enable_price_tracking_menu_item,
0)));
// Price Tracking disable
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.disable_price_tracking_menu_id,
R.string.disable_price_tracking_menu_item,
0)));
// AI / AI PDF
if (ChromeFeatureList.isEnabled(
ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_PAGE_SUMMARY)) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.ai_web_menu_id, R.string.menu_summarize_with_ai, 0)));
}
// Find in page
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.find_in_page_id, R.string.menu_find_in_page, 0)));
// Translate
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.translate_id, R.string.menu_translate, 0)));
// Read aloud
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.readaloud_menu_id, R.string.menu_listen_to_this_page, 0)));
// Reader mode
if (DomDistillerFeatures.showAlwaysOnEntryPoint()
|| DomDistillerFeatures.sReaderModeDistillInApp.isEnabled()) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.reader_mode_menu_id, R.string.show_reading_mode_text, 0)));
}
// Open with
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.open_with_id, R.string.menu_open_with, 0)));
// Universal Install / Open Web APK
if (WebappsUtils.isAddToHomeIntentSupported()) {
// This is the 'webapp is already installed' case, so we offer to open the webapp.
String appName = mContext.getString(R.string.webapp);
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildBaseModelForTextItem(R.id.open_webapk_id)
.with(
AppMenuItemProperties.TITLE,
mContext.getString(R.string.menu_open_webapk, appName))
.build()));
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.universal_install, R.string.menu_add_to_homescreen, 0)));
}
// RDS
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.reader_mode_prefs_id, R.string.menu_reader_mode_prefs, 0)));
// Auto Dark
if (ChromeFeatureList.isEnabled(
ChromeFeatureList.DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING)) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.auto_dark_web_contents_id,
R.string.menu_auto_dark_web_contents,
0)));
}
// Paint Preview
if (ChromeFeatureList.sPaintPreviewDemo.isEnabled()) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.paint_preview_show_id,
R.string.menu_paint_preview_show,
0)));
}
// Get Image Descriptions
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.get_image_descriptions_id,
R.string.menu_get_image_descriptions,
0)));
// Listen to the Feed
if (ChromeFeatureList.isEnabled(ChromeFeatureList.FEED_AUDIO_OVERVIEWS)) {
modelList.add(
new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
R.id.listen_to_feed_id, R.string.menu_listen_to_feed, 0)));
}
return modelList;
}
@Override
public MVCListAdapter.ModelList buildMenuModelList() {
MVCListAdapter.ModelList modelList = super.buildMenuModelList();
@@ -256,6 +624,9 @@ public class BraveTabbedAppMenuPropertiesDelegate extends TabbedAppMenuPropertie
// Apply Brave icons.
maybeReplaceIcons(modelList);
// Customize menu item visibility.
CustomizeBraveMenu.applyCustomization(mContext.getResources(), modelList);
return modelList;
}
@@ -337,6 +708,7 @@ public class BraveTabbedAppMenuPropertiesDelegate extends TabbedAppMenuPropertie
}
}
modelList.add(buildBraveNewsItem());
modelList.add(buildCustomMenuItem());
modelList.add(buildExitItem());
}
@@ -392,6 +764,18 @@ public class BraveTabbedAppMenuPropertiesDelegate extends TabbedAppMenuPropertie
shouldShowIconBeforeItem() ? R.drawable.brave_menu_set_as_default : 0));
}
private MVCListAdapter.ListItem buildCustomMenuItem() {
return new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
buildModelForStandardMenuItem(
CustomizeBraveMenu.BRAVE_CUSTOMIZE_ITEM_ID,
R.string.customize_menu_title,
shouldShowIconBeforeItem()
? org.chromium.brave.browser.customize_menu.R.drawable
.ic_window_screwdriver
: 0));
}
private MVCListAdapter.ListItem buildExitItem() {
return new MVCListAdapter.ListItem(
AppMenuHandler.AppMenuItemType.STANDARD,
+1
View File
@@ -12,6 +12,7 @@
<item name="add_to_playlist_id" type="id"/>
<item name="brave_leo_id" type="id"/>
<item name="brave_news_id" type="id"/>
<item name="brave_customize_menu_id" type="id"/>
<item name="exit_id" type="id"/>
<item name="action_save" type="id"/>
<item name="help_id" type="id"/>
@@ -5,6 +5,12 @@
You can obtain one at https://mozilla.org/MPL/2.0/. -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<org.chromium.components.browser_ui.settings.ChromeBasePreference
android:fragment="org.chromium.brave.browser.customize_menu.settings.BraveCustomizeMenuPreferenceFragment"
android:key="brave_customize_menu"
android:icon="@drawable/ic_window_screwdriver"
android:title="@string/customize_menu_title"/>
<org.chromium.components.browser_ui.settings.ChromeBasePreference
android:fragment="org.chromium.chrome.browser.toolbar.settings.AddressBarSettingsFragment"
android:key="address_bar"