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:
@@ -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();
|
||||
|
||||
+384
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user