Bug 1348412 - Add dist specific menu for set as homepage. r?snorp
MozReview-Commit-ID: 1ipDDs4ZVAm
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -11,16 +11,17 @@ import android.app.DownloadManager;
import android.content.ContentProviderClient;
import android.os.Environment;
import android.os.Process;
import android.support.annotation.NonNull;
import android.support.annotation.UiThread;
import android.graphics.Rect;
+import org.mozilla.gecko.GeckoSharedPrefs;
import org.mozilla.gecko.activitystream.ActivityStream;
import org.mozilla.gecko.adjust.AdjustBrowserAppDelegate;
import org.mozilla.gecko.annotation.RobocopTarget;
import org.mozilla.gecko.AppConstants.Versions;
import org.mozilla.gecko.DynamicToolbar.VisibilityTransition;
import org.mozilla.gecko.Tabs.TabEvents;
import org.mozilla.gecko.animation.PropertyAnimator;
import org.mozilla.gecko.animation.ViewHelper;
@@ -1429,16 +1430,36 @@ public class BrowserApp extends GeckoApp
}
});
Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU,
getResources().getResourceEntryName(itemId));
return true;
}
+ if (itemId == R.id.set_as_homepage) {
+ final Tab tab = Tabs.getInstance().getSelectedTab();
+ if (tab == null) {
+ return true;
+ }
+
+ final String url = tab.getURL();
+ if (url == null) {
+ return true;
+ }
+ final SharedPreferences prefs = GeckoSharedPrefs.forProfile(this);
+ final SharedPreferences.Editor editor = prefs.edit();
+ editor.putString(GeckoPreferences.PREFS_HOMEPAGE, url);
+ editor.apply();
+
+ Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU,
+ getResources().getResourceEntryName(itemId));
+ return true;
+ }
+
return false;
}
@Override
public void setAccessibilityEnabled(boolean enabled) {
super.setAccessibilityEnabled(enabled);
mDynamicToolbar.setAccessibilityEnabled(enabled);
}
@@ -3408,16 +3429,17 @@ public class BrowserApp extends GeckoApp
findInPage.setEnabled(false);
// NOTE: Use MenuUtils.safeSetEnabled because some actions might
// be on the BrowserToolbar context menu.
MenuUtils.safeSetEnabled(aMenu, R.id.page, false);
MenuUtils.safeSetEnabled(aMenu, R.id.subscribe, false);
MenuUtils.safeSetEnabled(aMenu, R.id.add_search_engine, false);
MenuUtils.safeSetEnabled(aMenu, R.id.add_to_launcher, false);
+ MenuUtils.safeSetEnabled(aMenu, R.id.set_as_homepage, false);
return true;
}
// If tab data IS available we need to manually enable items as necessary. They may have
// been disabled if returning early above, hence every item must be toggled, even if it's
// always expected to be enabled (e.g. the bookmark star is always enabled, except when
// we don't have tab data).
@@ -3478,22 +3500,26 @@ public class BrowserApp extends GeckoApp
// Disable share menuitem for about:, chrome:, file:, and resource: URIs
final boolean shareVisible = Restrictions.isAllowed(this, Restrictable.SHARE);
share.setVisible(shareVisible);
final boolean shareEnabled = StringUtils.isShareableUrl(url) && shareVisible;
share.setEnabled(shareEnabled);
MenuUtils.safeSetEnabled(aMenu, R.id.downloads, Restrictions.isAllowed(this, Restrictable.DOWNLOAD));
+ final boolean distSetAsHomepage = GeckoSharedPrefs.forProfile(this).getBoolean(GeckoPreferences.PREFS_SET_AS_HOMEPAGE, false);
+ MenuUtils.safeSetVisible(aMenu, R.id.set_as_homepage, distSetAsHomepage);
+
// NOTE: Use MenuUtils.safeSetEnabled because some actions might
// be on the BrowserToolbar context menu.
MenuUtils.safeSetEnabled(aMenu, R.id.page, !isAboutHome(tab));
MenuUtils.safeSetEnabled(aMenu, R.id.subscribe, tab.hasFeeds());
MenuUtils.safeSetEnabled(aMenu, R.id.add_search_engine, tab.hasOpenSearch());
MenuUtils.safeSetEnabled(aMenu, R.id.add_to_launcher, !isAboutHome(tab));
+ MenuUtils.safeSetEnabled(aMenu, R.id.set_as_homepage, !isAboutHome(tab));
// This provider also applies to the quick share menu item.
final GeckoActionProvider provider = ((GeckoMenuItem) share).getGeckoActionProvider();
if (provider != null) {
Intent shareIntent = provider.getIntent();
// For efficiency, the provider's intent is only set once
if (shareIntent == null) {
--- a/mobile/android/base/java/org/mozilla/gecko/home/HomeFragment.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/HomeFragment.java
@@ -6,42 +6,45 @@
package org.mozilla.gecko.home;
import java.util.EnumSet;
import org.mozilla.gecko.EditBookmarkDialog;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoApplication;
import org.mozilla.gecko.GeckoProfile;
+import org.mozilla.gecko.GeckoSharedPrefs;
import org.mozilla.gecko.IntentHelper;
import org.mozilla.gecko.R;
import org.mozilla.gecko.SnackbarBuilder;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.db.BrowserContract;
import org.mozilla.gecko.db.BrowserDB;
import org.mozilla.gecko.db.BrowserContract.SuggestedSites;
import org.mozilla.gecko.distribution.PartnerBookmarksProviderProxy;
import org.mozilla.gecko.home.HomeContextMenuInfo.RemoveItemType;
import org.mozilla.gecko.home.HomePager.OnUrlOpenInBackgroundListener;
import org.mozilla.gecko.home.HomePager.OnUrlOpenListener;
import org.mozilla.gecko.home.TopSitesGridView.TopSitesGridContextMenuInfo;
+import org.mozilla.gecko.preferences.GeckoPreferences;
import org.mozilla.gecko.reader.SavedReaderViewHelper;
import org.mozilla.gecko.reader.ReadingListHelper;
import org.mozilla.gecko.restrictions.Restrictable;
import org.mozilla.gecko.restrictions.Restrictions;
import org.mozilla.gecko.util.Clipboard;
import org.mozilla.gecko.util.StringUtils;
import org.mozilla.gecko.util.ThreadUtils;
import org.mozilla.gecko.util.UIAsyncTask;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
@@ -190,16 +193,18 @@ public abstract class HomeFragment exten
if (!StringUtils.isShareableUrl(info.url) || GeckoProfile.get(getActivity()).inGuestMode()) {
menu.findItem(R.id.home_share).setVisible(false);
}
if (!Restrictions.isAllowed(view.getContext(), Restrictable.PRIVATE_BROWSING)) {
menu.findItem(R.id.home_open_private_tab).setVisible(false);
}
+ final boolean distSetAsHomepage = GeckoSharedPrefs.forProfile(view.getContext()).getBoolean(GeckoPreferences.PREFS_SET_AS_HOMEPAGE, false);
+ menu.findItem(R.id.home_set_as_homepage).setVisible(distSetAsHomepage);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// onContextItemSelected() is first dispatched to the activity and
// then dispatched to its fragments. Since fragments cannot "override"
// menu item selection handling, it's better to avoid menu id collisions
// between the activity and its fragments.
@@ -304,16 +309,25 @@ public abstract class HomeFragment exten
if (info.hasPartnerBookmarkId()) {
new RemovePartnerBookmarkTask(context, info.bookmarkId).execute();
} else {
new RemoveItemByUrlTask(context, info.url, info.itemType, position).execute();
}
return true;
}
+ if (itemId == R.id.home_set_as_homepage) {
+ final SharedPreferences prefs = GeckoSharedPrefs.forProfile(context);
+ final SharedPreferences.Editor editor = prefs.edit();
+ editor.putString(GeckoPreferences.PREFS_HOMEPAGE, info.url);
+ editor.apply();
+ Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU,
+ getResources().getResourceEntryName(itemId));
+ return true;
+ }
return false;
}
@Override
public void setUserVisibleHint (boolean isVisibleToUser) {
if (isVisibleToUser == getUserVisibleHint()) {
return;
}
--- a/mobile/android/base/java/org/mozilla/gecko/home/TopSitesPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/TopSitesPanel.java
@@ -12,31 +12,33 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import org.mozilla.gecko.GeckoProfile;
+import org.mozilla.gecko.GeckoSharedPrefs;
import org.mozilla.gecko.R;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.db.BrowserContract.Thumbnails;
import org.mozilla.gecko.db.BrowserContract.TopSites;
import org.mozilla.gecko.db.BrowserDB;
import org.mozilla.gecko.gfx.BitmapUtils;
import org.mozilla.gecko.home.HomeContextMenuInfo.RemoveItemType;
import org.mozilla.gecko.home.HomePager.OnUrlOpenListener;
import org.mozilla.gecko.home.PinSiteDialog.OnSiteSelectedListener;
import org.mozilla.gecko.home.TopSitesGridView.OnEditPinnedSiteListener;
import org.mozilla.gecko.home.TopSitesGridView.TopSitesGridContextMenuInfo;
import org.mozilla.gecko.icons.IconCallback;
import org.mozilla.gecko.icons.IconResponse;
import org.mozilla.gecko.icons.Icons;
+import org.mozilla.gecko.preferences.GeckoPreferences;
import org.mozilla.gecko.restrictions.Restrictable;
import org.mozilla.gecko.restrictions.Restrictions;
import org.mozilla.gecko.util.StringUtils;
import org.mozilla.gecko.util.ThreadUtils;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
@@ -353,16 +355,18 @@ public class TopSitesPanel extends HomeF
if (!StringUtils.isShareableUrl(info.url) || GeckoProfile.get(getActivity()).inGuestMode()) {
menu.findItem(R.id.home_share).setVisible(false);
}
if (!Restrictions.isAllowed(context, Restrictable.PRIVATE_BROWSING)) {
menu.findItem(R.id.home_open_private_tab).setVisible(false);
}
+ final boolean distSetAsHomepage = GeckoSharedPrefs.forProfile(view.getContext()).getBoolean(GeckoPreferences.PREFS_SET_AS_HOMEPAGE, false);
+ menu.findItem(R.id.home_set_as_homepage).setVisible(distSetAsHomepage);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (super.onContextItemSelected(item)) {
// HomeFragment was able to handle to selected item.
return true;
}
--- a/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
@@ -170,16 +170,17 @@ public class GeckoPreferences
public static final String PREFS_CUSTOM_TABS = NON_PREF_PREFIX + "customtabs";
public static final String PREFS_ACTIVITY_STREAM = NON_PREF_PREFIX + "experiments.activitystream";
public static final String PREFS_CATEGORY_EXPERIMENTAL_FEATURES = NON_PREF_PREFIX + "category_experimental";
public static final String PREFS_COMPACT_TABS = NON_PREF_PREFIX + "compact_tabs";
public static final String PREFS_SHOW_QUIT_MENU = NON_PREF_PREFIX + "distribution.show_quit_menu";
public static final String PREFS_SEARCH_SUGGESTIONS_ENABLED = "browser.search.suggest.enabled";
public static final String PREFS_DEFAULT_BROWSER = NON_PREF_PREFIX + "default_browser.link";
public static final String PREFS_SYSTEM_FONT_SIZE = NON_PREF_PREFIX + "font.size.use_system_font_size";
+ public static final String PREFS_SET_AS_HOMEPAGE = NON_PREF_PREFIX + "distribution.set_as_homepage";
private static final String ACTION_STUMBLER_UPLOAD_PREF = "STUMBLER_PREF";
// This isn't a Gecko pref, even if it looks like one.
private static final String PREFS_BROWSER_LOCALE = "locale";
public static final String PREFS_RESTORE_SESSION = NON_PREF_PREFIX + "restoreSession3";
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java
@@ -9,30 +9,32 @@ import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import org.mozilla.gecko.AppConstants.Versions;
import org.mozilla.gecko.BrowserApp;
import org.mozilla.gecko.GeckoAppShell;
+import org.mozilla.gecko.GeckoSharedPrefs;
import org.mozilla.gecko.R;
import org.mozilla.gecko.SiteIdentity;
import org.mozilla.gecko.Tab;
import org.mozilla.gecko.Tabs;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.TouchEventInterceptor;
import org.mozilla.gecko.animation.PropertyAnimator;
import org.mozilla.gecko.animation.PropertyAnimator.PropertyAnimationListener;
import org.mozilla.gecko.animation.ViewHelper;
import org.mozilla.gecko.lwt.LightweightTheme;
import org.mozilla.gecko.lwt.LightweightThemeDrawable;
import org.mozilla.gecko.menu.GeckoMenu;
import org.mozilla.gecko.menu.MenuPopup;
+import org.mozilla.gecko.preferences.GeckoPreferences;
import org.mozilla.gecko.tabs.TabHistoryController;
import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.OnStopListener;
import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.OnTitleChangeListener;
import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.UpdateFlags;
import org.mozilla.gecko.util.Clipboard;
import org.mozilla.gecko.util.HardwareUtils;
import org.mozilla.gecko.util.MenuUtils;
import org.mozilla.gecko.widget.themed.ThemedFrameLayout;
@@ -234,24 +236,28 @@ public abstract class BrowserToolbar ext
}
Tab tab = Tabs.getInstance().getSelectedTab();
if (tab != null) {
String url = tab.getURL();
if (url == null) {
menu.findItem(R.id.copyurl).setVisible(false);
menu.findItem(R.id.add_to_launcher).setVisible(false);
+ menu.findItem(R.id.set_as_homepage).setVisible(false);
}
MenuUtils.safeSetVisible(menu, R.id.subscribe, tab.hasFeeds());
MenuUtils.safeSetVisible(menu, R.id.add_search_engine, tab.hasOpenSearch());
+ final boolean distSetAsHomepage = GeckoSharedPrefs.forProfile(context).getBoolean(GeckoPreferences.PREFS_SET_AS_HOMEPAGE, false);
+ MenuUtils.safeSetVisible(menu, R.id.set_as_homepage, distSetAsHomepage);
} else {
// if there is no tab, remove anything tab dependent
menu.findItem(R.id.copyurl).setVisible(false);
menu.findItem(R.id.add_to_launcher).setVisible(false);
+ menu.findItem(R.id.set_as_homepage).setVisible(false);
MenuUtils.safeSetVisible(menu, R.id.subscribe, false);
MenuUtils.safeSetVisible(menu, R.id.add_search_engine, false);
}
}
});
setOnClickListener(new OnClickListener() {
@Override
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -489,16 +489,17 @@
<!ENTITY media_play "Play">
<!ENTITY media_pause "Pause">
<!ENTITY media_stop "Stop">
<!ENTITY contextmenu_open_new_tab "Open in New Tab">
<!ENTITY contextmenu_open_private_tab "Open in Private Tab">
<!ENTITY contextmenu_remove "Remove">
<!ENTITY contextmenu_add_to_launcher "Add to Home Screen">
+<!ENTITY contextmenu_set_as_homepage "Set as Homepage">
<!ENTITY contextmenu_share "Share">
<!ENTITY contextmenu_pasteandgo "Paste & Go">
<!ENTITY contextmenu_paste "Paste">
<!ENTITY contextmenu_copyurl "Copy Address">
<!ENTITY contextmenu_edit_bookmark "Edit">
<!ENTITY contextmenu_subscribe "Subscribe to Page">
<!ENTITY contextmenu_site_settings "Edit Site Settings">
<!ENTITY contextmenu_top_sites_edit "Edit">
--- a/mobile/android/base/resources/menu-large/browser_app_menu.xml
+++ b/mobile/android/base/resources/menu-large/browser_app_menu.xml
@@ -68,16 +68,19 @@
android:title="@string/print"/>
<item android:id="@+id/add_search_engine"
android:title="@string/contextmenu_add_search_engine"/>
<item android:id="@+id/add_to_launcher"
android:title="@string/contextmenu_add_to_launcher"/>
+ <item android:id="@+id/set_as_homepage"
+ android:title="@string/contextmenu_set_as_homepage"/>
+
</menu>
</item>
<item android:id="@+id/tools"
android:title="@string/tools">
<menu>
--- a/mobile/android/base/resources/menu-v11/titlebar_contextmenu.xml
+++ b/mobile/android/base/resources/menu-v11/titlebar_contextmenu.xml
@@ -12,9 +12,12 @@
android:title="@string/contextmenu_paste"/>
<item android:id="@+id/copyurl"
android:title="@string/contextmenu_copyurl"/>
<item android:id="@+id/add_to_launcher"
android:title="@string/contextmenu_add_to_launcher"/>
+ <item android:id="@+id/set_as_homepage"
+ android:title="@string/contextmenu_set_as_homepage"/>
+
</menu>
--- a/mobile/android/base/resources/menu-xlarge/browser_app_menu.xml
+++ b/mobile/android/base/resources/menu-xlarge/browser_app_menu.xml
@@ -69,16 +69,19 @@
android:title="@string/print"/>
<item android:id="@+id/add_search_engine"
android:title="@string/contextmenu_add_search_engine"/>
<item android:id="@+id/add_to_launcher"
android:title="@string/contextmenu_add_to_launcher"/>
+ <item android:id="@+id/set_as_homepage"
+ android:title="@string/contextmenu_set_as_homepage"/>
+
</menu>
</item>
<item android:id="@+id/tools"
android:title="@string/tools">
<menu>
--- a/mobile/android/base/resources/menu/browser_app_menu.xml
+++ b/mobile/android/base/resources/menu/browser_app_menu.xml
@@ -68,16 +68,19 @@
android:title="@string/print"/>
<item android:id="@+id/add_search_engine"
android:title="@string/contextmenu_add_search_engine"/>
<item android:id="@+id/add_to_launcher"
android:title="@string/contextmenu_add_to_launcher"/>
+ <item android:id="@+id/set_as_homepage"
+ android:title="@string/contextmenu_set_as_homepage"/>
+
</menu>
</item>
<item android:id="@+id/tools"
android:title="@string/tools">
<menu>
--- a/mobile/android/base/resources/menu/home_contextmenu.xml
+++ b/mobile/android/base/resources/menu/home_contextmenu.xml
@@ -30,9 +30,12 @@
android:title="@string/contextmenu_edit_bookmark"/>
<item android:id="@+id/home_remove"
android:title="@string/contextmenu_remove"/>
<item android:id="@+id/home_add_to_launcher"
android:title="@string/contextmenu_add_to_launcher"/>
+ <item android:id="@+id/home_set_as_homepage"
+ android:title="@string/contextmenu_set_as_homepage"/>
+
</menu>
--- a/mobile/android/base/resources/menu/titlebar_contextmenu.xml
+++ b/mobile/android/base/resources/menu/titlebar_contextmenu.xml
@@ -18,9 +18,12 @@
android:title="@string/contextmenu_add_search_engine"/>
<item android:id="@+id/copyurl"
android:title="@string/contextmenu_copyurl"/>
<item android:id="@+id/add_to_launcher"
android:title="@string/contextmenu_add_to_launcher"/>
+ <item android:id="@+id/set_as_homepage"
+ android:title="@string/contextmenu_set_as_homepage"/>
+
</menu>
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -392,16 +392,17 @@
<string name="site_settings_clear">&site_settings_clear;</string>
<string name="page_action_dropmarker_description">&page_action_dropmarker_description;</string>
<string name="contextmenu_open_new_tab">&contextmenu_open_new_tab;</string>
<string name="contextmenu_open_private_tab">&contextmenu_open_private_tab;</string>
<string name="contextmenu_remove">&contextmenu_remove;</string>
<string name="contextmenu_add_to_launcher">&contextmenu_add_to_launcher;</string>
+ <string name="contextmenu_set_as_homepage">&contextmenu_set_as_homepage;</string>
<string name="contextmenu_share">&contextmenu_share;</string>
<string name="contextmenu_pasteandgo">&contextmenu_pasteandgo;</string>
<string name="contextmenu_paste">&contextmenu_paste;</string>
<string name="contextmenu_copyurl">&contextmenu_copyurl;</string>
<string name="contextmenu_edit_bookmark">&contextmenu_edit_bookmark;</string>
<string name="contextmenu_subscribe">&contextmenu_subscribe;</string>
<string name="contextmenu_site_settings">&contextmenu_site_settings;</string>
<string name="contextmenu_top_sites_edit">&contextmenu_top_sites_edit;</string>