diff options
author | jianli <jianli@chromium.org> | 2016-01-19 20:11:07 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-20 04:12:26 +0000 |
commit | 33ced7a1ea60824e88c132d727dd864b37b0e6e2 (patch) | |
tree | 1f309fff93c417ce6d324e5f01574798ef0e749c | |
parent | 78f86e4a1f05241ed5dae1d67faeeec8e87a4351 (diff) | |
download | chromium_src-33ced7a1ea60824e88c132d727dd864b37b0e6e2.zip chromium_src-33ced7a1ea60824e88c132d727dd864b37b0e6e2.tar.gz chromium_src-33ced7a1ea60824e88c132d727dd864b37b0e6e2.tar.bz2 |
Show alternate UI strings for offline pages per experiment settings
BUG=565566
Review URL: https://codereview.chromium.org/1580233002
Cr-Commit-Position: refs/heads/master@{#370299}
40 files changed, 435 insertions, 113 deletions
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index f2f5fe2..8dc2aa3 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn @@ -178,7 +178,8 @@ android_library("chrome_java") { ":custom_tabs_service_aidl", "//chrome:page_info_connection_type_javagen", "//components/enhanced_bookmarks:enhanced_bookmarks_java_enums_srcjar", - "//components/offline_pages:offline_pages_enums_java", + "//components/offline_pages:offline_page_feature_enums_java", + "//components/offline_pages:offline_page_model_enums_java", "//components/omnibox/browser:autocomplete_match_type_javagen", "//components/security_state:security_state_enums_java", ] diff --git a/chrome/android/chrome_apk.gyp b/chrome/android/chrome_apk.gyp index 9fc4083..d6d3312 100644 --- a/chrome/android/chrome_apk.gyp +++ b/chrome/android/chrome_apk.gyp @@ -291,7 +291,8 @@ '../../chrome/chrome.gyp:chrome_java_test_support', '../../components/components.gyp:invalidation_javatests', '../../components/components.gyp:gcm_driver_java', - '../../components/components.gyp:offline_pages_enums_java', + '../../components/components.gyp:offline_page_feature_enums_java', + '../../components/components.gyp:offline_page_model_enums_java', '../../components/components.gyp:precache_javatests', '../../components/components.gyp:security_state_enums_java', '../../components/components.gyp:web_contents_delegate_android_java', diff --git a/chrome/android/java/res/layout/new_tab_page.xml b/chrome/android/java/res/layout/new_tab_page.xml index 8af2128..ae21847 100644 --- a/chrome/android/java/res/layout/new_tab_page.xml +++ b/chrome/android/java/res/layout/new_tab_page.xml @@ -174,7 +174,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:background="?attr/listChoiceBackgroundIndicator" - android:contentDescription="@string/accessibility_ntp_toolbar_btn_bookmarks" + android:contentDescription="@null" android:paddingTop="12dp" android:paddingBottom="12dp" > <TextView @@ -183,7 +183,7 @@ android:layout_gravity="center_horizontal" android:drawablePadding="8dp" android:gravity="center_vertical" - android:text="@string/ntp_bookmarks" + android:text="@null" android:textSize="12sp" android:textColor="#5a5a5a" /> </FrameLayout> diff --git a/chrome/android/java/res/layout/new_tab_page_incognito.xml b/chrome/android/java/res/layout/new_tab_page_incognito.xml index 9bbd65e..00777bf 100644 --- a/chrome/android/java/res/layout/new_tab_page_incognito.xml +++ b/chrome/android/java/res/layout/new_tab_page_incognito.xml @@ -57,7 +57,7 @@ android:layout_marginBottom="10dp" android:maxWidth="660dp" android:singleLine="false" - android:text="@string/new_tab_incognito_message" + android:text="@null" android:textColor="#bdbdbd" android:textSize="14sp" android:lineSpacingMultiplier="1.2" /> diff --git a/chrome/android/java/res/menu/eb_action_bar_menu.xml b/chrome/android/java/res/menu/eb_action_bar_menu.xml index 8df9339..9952be7 100644 --- a/chrome/android/java/res/menu/eb_action_bar_menu.xml +++ b/chrome/android/java/res/menu/eb_action_bar_menu.xml @@ -16,7 +16,7 @@ <item android:id="@+id/search_menu_id" android:icon="@drawable/ic_search" - android:title="@string/enhanced_bookmark_action_bar_search" + android:title="@null" android:visible="false" chrome:showAsAction="ifRoom"/> <item @@ -31,17 +31,17 @@ <item android:id="@+id/selection_mode_edit_menu_id" android:icon="@drawable/eb_edit_active" - android:title="@string/edit_bookmark" + android:title="@null" chrome:showAsAction="ifRoom"/> <item android:id="@+id/selection_mode_move_menu_id" android:icon="@drawable/eb_move_active" - android:title="@string/enhanced_bookmark_action_bar_move" + android:title="@null" chrome:showAsAction="ifRoom"/> <item android:id="@+id/selection_mode_delete_menu_id" android:icon="@drawable/eb_delete_white" - android:title="@string/enhanced_bookmark_action_bar_delete" + android:title="@null" chrome:showAsAction="ifRoom"/> </group> diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml index fd02acd..74afcd1 100644 --- a/chrome/android/java/res/menu/main_menu.xml +++ b/chrome/android/java/res/menu/main_menu.xml @@ -32,7 +32,7 @@ <item android:id="@+id/new_incognito_tab_menu_id" android:title="@string/menu_new_incognito_tab" /> <item android:id="@+id/all_bookmarks_menu_id" - android:title="@string/menu_bookmarks" /> + android:title="@null" /> <item android:id="@+id/recent_tabs_menu_id" android:title="@string/menu_recent_tabs" /> <item android:id="@+id/open_history_menu_id" diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java index 636c14a..691d0eb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java @@ -176,11 +176,32 @@ public abstract class ChromeSwitches { public static final String NTP_SWITCH_TO_EXISTING_TAB = "ntp-switch-to-existing-tab"; /** - * Enable offline pages. + * Enables offline pages. + * Native switch - switches::kEnableOfflinePages */ public static final String ENABLE_OFFLINE_PAGES = "enable-offline-pages"; /** + * Enables offline pages, showing 'bookmarks' name in UI strings. + * Native switch - switches::kEnableOfflinePagesAsBookmarks + */ + public static final String ENABLE_OFFLINE_PAGES_AS_BOOKMARKS = + "enable-offline-pages-as-bookmarks"; + + /** + * Enables offline pages, showing 'saved pages' name in UI strings. + * Native switch - switches::kEnableOfflinePagesAsSavedPages + */ + public static final String ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES = + "enable-offline-pages-as-saved-pages"; + + /** + * Disables offline pages. + * Native switch - switches::kDisableOfflinePages + */ + public static final String DISABLE_OFFLINE_PAGES = "disable-offline-pages"; + + /** * Enable keyboard accessory view that shows autofill suggestions on top of the keyboard. * Native switch - autofill::switches::kEnableAccessorySuggestionView */ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java index 1fb2909..26120fa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java @@ -14,7 +14,7 @@ import org.chromium.chrome.browser.ChromeBrowserProviderClient; import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.bookmark.BookmarksBridge; -import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper; import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils; import org.chromium.chrome.browser.preferences.PrefServiceBridge; @@ -119,11 +119,9 @@ public class AppMenuPropertiesDelegate { recentTabsMenuItem.setVisible(!isIncognito && FeatureUtilities.canAllowSync(mActivity)); recentTabsMenuItem.setTitle(R.string.menu_recent_tabs); - if (OfflinePageBridge.isEnabled()) { - MenuItem allBookmarksMenuItem = menu.findItem(R.id.all_bookmarks_menu_id); - allBookmarksMenuItem.setTitle(mActivity.getString( - R.string.menu_bookmarks_offline_pages)); - } + MenuItem allBookmarksMenuItem = menu.findItem(R.id.all_bookmarks_menu_id); + allBookmarksMenuItem.setTitle( + mActivity.getString(OfflinePageUtils.getStringId(R.string.menu_bookmarks))); // Don't allow "chrome://" pages to be shared. menu.findItem(R.id.share_row_menu_id).setVisible(!isChromeScheme); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java index 9111640..bb76d1a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java @@ -19,7 +19,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.bookmark.BookmarksBridge.BookmarkItem; import org.chromium.chrome.browser.bookmark.BookmarksBridge.BookmarkModelObserver; -import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.widget.NumberRollView; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.bookmarks.BookmarkType; @@ -58,16 +58,20 @@ public class EnhancedBookmarkActionBar extends Toolbar implements EnhancedBookma if (DeviceFormFactor.isTablet(context)) getMenu().removeItem(R.id.close_menu_id); setOnMenuItemClickListener(this); - if (OfflinePageBridge.isEnabled()) { - getMenu().findItem(R.id.search_menu_id).setTitle( - R.string.offline_pages_action_bar_search); - getMenu().findItem(R.id.selection_mode_edit_menu_id).setTitle( - R.string.offline_pages_edit_item); - getMenu().findItem(R.id.selection_mode_move_menu_id).setTitle( - R.string.offline_pages_action_bar_move); - getMenu().findItem(R.id.selection_mode_delete_menu_id).setTitle( - R.string.offline_pages_action_bar_delete); - } + getMenu() + .findItem(R.id.search_menu_id) + .setTitle(OfflinePageUtils.getStringId( + R.string.enhanced_bookmark_action_bar_search)); + getMenu() + .findItem(R.id.selection_mode_edit_menu_id) + .setTitle(OfflinePageUtils.getStringId(R.string.edit_bookmark)); + getMenu() + .findItem(R.id.selection_mode_move_menu_id) + .setTitle(OfflinePageUtils.getStringId(R.string.enhanced_bookmark_action_bar_move)); + getMenu() + .findItem(R.id.selection_mode_delete_menu_id) + .setTitle(OfflinePageUtils.getStringId( + R.string.enhanced_bookmark_action_bar_delete)); } @Override @@ -295,8 +299,6 @@ public class EnhancedBookmarkActionBar extends Toolbar implements EnhancedBookma } private int getTitleForAllItems() { - return OfflinePageBridge.isEnabled() - ? R.string.offline_pages_all_items - : R.string.enhanced_bookmark_title_bar_all_items; + return OfflinePageUtils.getStringId(R.string.enhanced_bookmark_title_bar_all_items); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java index 485f05d..fb0c1b6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java @@ -11,7 +11,7 @@ import android.view.WindowManager; import org.chromium.chrome.R; import org.chromium.chrome.browser.UrlConstants; -import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable; import org.chromium.components.bookmarks.BookmarkId; @@ -42,9 +42,8 @@ public class EnhancedBookmarkActivity extends EnhancedBookmarkActivityBase imple mBookmarkManager.updateForUrl(url); setContentView(mBookmarkManager.getView()); - EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode(this, getString( - OfflinePageBridge.isEnabled() ? R.string.offline_pages_saved_pages - : R.string.bookmarks)); + EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode( + this, getString(OfflinePageUtils.getStringId(R.string.bookmarks))); // Hack to work around inferred theme false lint error: http://crbug.com/445633 assert (R.layout.eb_main_content != 0); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java index f59752e..9f00503 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java @@ -12,7 +12,7 @@ import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.widget.FadingShadow; import org.chromium.chrome.browser.widget.FadingShadowView; import org.chromium.chrome.browser.widget.LoadingView; @@ -45,8 +45,7 @@ public class EnhancedBookmarkContentView extends RelativeLayout implements super.onFinishInflate(); mItemsContainer = (EnhancedBookmarkRecyclerView) findViewById(R.id.eb_items_container); TextView emptyView = (TextView) findViewById(R.id.eb_empty_view); - emptyView.setText(OfflinePageBridge.isEnabled() - ? R.string.offline_pages_folder_empty : R.string.bookmarks_folder_empty); + emptyView.setText(OfflinePageUtils.getStringId(R.string.bookmarks_folder_empty)); mItemsContainer.setEmptyView(emptyView); mActionBar = (EnhancedBookmarkActionBar) findViewById(R.id.eb_action_bar); mLoadingView = (LoadingView) findViewById(R.id.eb_initial_loading_view); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java index 2fd4c83..e7a3035 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java @@ -12,6 +12,7 @@ import android.widget.TextView; import org.chromium.chrome.R; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.components.bookmarks.BookmarkId; import java.util.ArrayList; @@ -326,10 +327,8 @@ class EnhancedBookmarkDrawerListViewAdapter extends BaseAdapter { switch (item.mType) { case TYPE_ALL_ITEMS: - title = listItemView.getContext().getResources() - .getString(OfflinePageBridge.isEnabled() - ? R.string.offline_pages_all_items - : R.string.enhanced_bookmark_drawer_all_items); + title = listItemView.getContext().getResources().getString( + OfflinePageUtils.getStringId(R.string.enhanced_bookmark_drawer_all_items)); iconDrawableId = R.drawable.btn_star; break; case TYPE_FOLDER: diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java index d5f5c5c..a925f57 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java @@ -26,6 +26,7 @@ import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.DeletePageCall import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageModelObserver; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback; import org.chromium.chrome.browser.offlinepages.OfflinePageItem; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.util.UrlUtilities; import org.chromium.chrome.browser.widget.EmptyAlertEditText; import org.chromium.chrome.browser.widget.TintedDrawable; @@ -106,9 +107,7 @@ public class EnhancedBookmarkEditActivity extends EnhancedBookmarkActivityBase { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - int title = OfflinePageBridge.isEnabled() - ? R.string.offline_pages_edit_item - : R.string.edit_bookmark; + int title = OfflinePageUtils.getStringId(R.string.edit_bookmark); setTitle(title); EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode(this, getString(title)); mEnhancedBookmarksModel = new EnhancedBookmarksModel(); @@ -257,17 +256,21 @@ public class EnhancedBookmarkEditActivity extends EnhancedBookmarkActivityBase { .getPageByBookmarkId(mBookmarkId); if (offlinePage != null) { // Offline page exists. Show information and button to remove. - offlinePageInfoTextView.setText(getString(R.string.bookmark_offline_page_size, - Formatter.formatFileSize(this, offlinePage.getFileSize()))); + offlinePageInfoTextView.setText( + getString(OfflinePageUtils.getStringId( + R.string.offline_pages_as_bookmarks_offline_page_size), + Formatter.formatFileSize(this, offlinePage.getFileSize()))); updateButtonToDeleteOfflinePage(saveRemoveVisitButton); } else if (mWebContents != null) { // Offline page is not saved, but a bookmarked page is opened. Show save button. - offlinePageInfoTextView.setText(getString(R.string.bookmark_offline_page_none)); + offlinePageInfoTextView.setText( + getString(OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none))); updateButtonToSaveOfflinePage(saveRemoveVisitButton); } else { // Offline page is not saved, and edit page was opened from the bookmarks UI, which // means there is no action the user can take any action - hide button. - offlinePageInfoTextView.setText(getString(R.string.bookmark_offline_page_visit)); + offlinePageInfoTextView.setText(getString(OfflinePageUtils.getStringId( + R.string.offline_pages_as_bookmarks_offline_page_visit))); updateButtonToVisitOfflinePage(saveRemoveVisitButton); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java index 889be8c..68b3223 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java @@ -14,7 +14,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.NativePage; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkDelegate.EnhancedBookmarkStateChangeListener; -import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.tab.Tab; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.ui.base.DeviceFormFactor; @@ -46,8 +46,7 @@ public class EnhancedBookmarkPage implements NativePage, EnhancedBookmarkStateCh private EnhancedBookmarkPage(Activity activity, Tab tab) { mActivity = activity; mTab = tab; - mTitle = activity.getString(OfflinePageBridge.isEnabled() - ? R.string.offline_pages_saved_pages : R.string.bookmarks); + mTitle = activity.getString(OfflinePageUtils.getStringId(R.string.bookmarks)); mBackgroundColor = ApiCompatibilityUtils.getColor(activity.getResources(), R.color.default_primary_color); mThemeColor = ApiCompatibilityUtils.getColor( diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java index 2069677..ce2aa58 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java @@ -133,26 +133,30 @@ public class EnhancedBookmarkUtils { int buttonId = R.string.enhanced_bookmark_item_edit; if (saveResult == AddBookmarkCallback.SKIPPED) { - messageId = R.string.offline_pages_page_skipped; + messageId = OfflinePageUtils.getStringId( + R.string.offline_pages_as_bookmarks_page_skipped); } else if (isStorageAlmostFull) { - messageId = saveResult == AddBookmarkCallback.SAVED - ? R.string.offline_pages_page_saved_storage_near_full - : R.string.offline_pages_page_failed_to_save_storage_near_full; + messageId = OfflinePageUtils.getStringId(saveResult == AddBookmarkCallback.SAVED + ? R.string.offline_pages_as_bookmarks_page_saved_storage_near_full + : R.string.offline_pages_as_bookmarks_page_failed_to_save_storage_near_full); // Show "Free up space" button. - buttonId = R.string.offline_pages_free_up_space_title; + buttonId = OfflinePageUtils.getStringId(R.string.offline_pages_free_up_space_title); snackbarController = createSnackbarControllerForFreeUpSpaceButton( bookmarkModel, snackbarManager, activity); } else { if (saveResult == AddBookmarkCallback.SAVED) { if (getLastUsedParent(activity) == null) { - messageId = R.string.offline_pages_page_saved; + messageId = OfflinePageUtils.getStringId( + R.string.offline_pages_as_bookmarks_page_saved); } else { - messageId = R.string.offline_pages_page_saved_folder; + messageId = OfflinePageUtils.getStringId( + R.string.offline_pages_as_bookmarks_page_saved_folder); suffix = bookmarkModel.getBookmarkTitle( bookmarkModel.getBookmarkById(bookmarkId).getParentId()); } } else { - messageId = R.string.offline_pages_page_failed_to_save; + messageId = OfflinePageUtils.getStringId( + R.string.offline_pages_as_bookmarks_page_failed_to_save); } } if (snackbarController == null) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java index 1cc0128..b1db008 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java @@ -18,7 +18,7 @@ import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareThumbnailProvider; import org.chromium.chrome.browser.help.HelpAndFeedback; import org.chromium.chrome.browser.ntp.IncognitoNewTabPageView.IncognitoNewTabPageManager; -import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.profiles.Profile; /** @@ -67,12 +67,10 @@ public class IncognitoNewTabPage implements NativePage, InvalidationAwareThumbna (IncognitoNewTabPageView) inflater.inflate(R.layout.new_tab_page_incognito, null); mIncognitoNewTabPageView.initialize(mIncognitoNewTabPageManager); - if (OfflinePageBridge.isEnabled()) { - TextView newTabIncognitoMessage = (TextView) mIncognitoNewTabPageView.findViewById( - R.id.new_tab_incognito_message); - newTabIncognitoMessage.setText(activity.getResources().getString( - R.string.offline_pages_new_tab_incognito_message)); - } + TextView newTabIncognitoMessage = (TextView) mIncognitoNewTabPageView.findViewById( + R.id.new_tab_incognito_message); + newTabIncognitoMessage.setText(activity.getResources().getString( + OfflinePageUtils.getStringId(R.string.new_tab_incognito_message))); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java index cfdb9a2..97eda05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java @@ -13,7 +13,7 @@ import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.widget.TintedDrawable; /** @@ -47,14 +47,11 @@ public class NewTabPageToolbar extends LinearLayout { protected void onFinishInflate() { mBookmarksButton = initButton(R.id.bookmarks_button, R.drawable.btn_star); mRecentTabsButton = initButton(R.id.recent_tabs_button, R.drawable.btn_recents); - if (OfflinePageBridge.isEnabled()) { - ((TextView) mBookmarksButton.getChildAt(0)).setText( - R.string.offline_pages_ntp_button_name); - ((TextView) mBookmarksButton.getChildAt(0)).setContentDescription( - getResources().getString(R.string.offline_pages_ntp_button_accessibility)); - } - ((TextView) mBookmarksButton.getChildAt(0)).setText(OfflinePageBridge.isEnabled() - ? R.string.offline_pages_ntp_button_name : R.string.ntp_bookmarks); + ((TextView) mBookmarksButton.getChildAt(0)) + .setText(OfflinePageUtils.getStringId(R.string.ntp_bookmarks)); + ((TextView) mBookmarksButton.getChildAt(0)) + .setContentDescription(getResources().getString(OfflinePageUtils.getStringId( + R.string.accessibility_ntp_toolbar_btn_bookmarks))); mInterestsButton = initButton(R.id.interests_button, R.drawable.btn_star_filled); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java index 9aea635..92b63d4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java @@ -16,6 +16,7 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.bookmarks.BookmarkType; import org.chromium.components.offlinepages.DeletePageResult; +import org.chromium.components.offlinepages.FeatureMode; import org.chromium.components.offlinepages.SavePageResult; import org.chromium.content_public.browser.WebContents; @@ -33,8 +34,8 @@ public final class OfflinePageBridge { private final ObserverList<OfflinePageModelObserver> mObservers = new ObserverList<OfflinePageModelObserver>(); - /** Whether the offline pages feature is enabled. */ - private static Boolean sIsEnabled; + /** Mode of the offline pages feature */ + private static Integer sFeatureMode; /** * Callback used to saving an offline page. @@ -158,12 +159,22 @@ public final class OfflinePageBridge { } /** - * Returns true if the offline pages feature is enabled. + * @return The mode of the offline pages feature. Uses + * {@see org.chromium.components.offlinepages.FeatureMode} enum. + */ + public static int getFeatureMode() { + ThreadUtils.assertOnUiThread(); + if (sFeatureMode == null) sFeatureMode = nativeGetFeatureMode(); + return sFeatureMode; + } + + /** + * @return True if the offline pages feature is enabled, regardless whether bookmark or saved + * page shown in UI strings. */ public static boolean isEnabled() { ThreadUtils.assertOnUiThread(); - if (sIsEnabled == null) sIsEnabled = nativeIsOfflinePagesEnabled(); - return sIsEnabled; + return getFeatureMode() != FeatureMode.DISABLED; } /** @@ -413,7 +424,7 @@ public final class OfflinePageBridge { url, bookmarkId, offlineUrl, fileSize, creationTime, accessCount, lastAccessTimeMs); } - private static native boolean nativeIsOfflinePagesEnabled(); + private static native int nativeGetFeatureMode(); private static native boolean nativeCanSavePage(String url); private native long nativeInit(Profile profile); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java index 16a4cd4..5596e332 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java @@ -52,7 +52,8 @@ public class OfflinePageFreeUpSpaceDialog * Creates a snackbar informing user that the storage has been cleared. */ public static Snackbar createStorageClearedSnackbar(Context context) { - return Snackbar.make(context.getString(R.string.offline_pages_storage_cleared), + return Snackbar.make(context.getString(OfflinePageUtils.getStringId( + R.string.offline_pages_storage_cleared)), new SnackbarController() { @Override public void onDismissForEachType(boolean isTimeout) {} @@ -70,10 +71,12 @@ public class OfflinePageFreeUpSpaceDialog mOfflinePagesToDelete = mOfflinePageBridge.getPagesToCleanUp(); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) - .setTitle(R.string.offline_pages_free_up_space_title) + .setTitle(OfflinePageUtils.getStringId( + R.string.offline_pages_free_up_space_title)) .setPositiveButton(R.string.delete, this) .setNegativeButton(R.string.cancel, this) - .setMessage(getString(R.string.offline_pages_free_up_space_message, + .setMessage(getString(OfflinePageUtils.getStringId( + R.string.offline_pages_free_up_space_message), mOfflinePagesToDelete.size(), Formatter.formatFileSize(getActivity(), getTotalSize()))); return builder.create(); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java index 921beaf..b5b7172 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java @@ -33,10 +33,12 @@ public class OfflinePageOpenStorageSettingsDialog { AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AlertDialogTheme) - .setTitle(R.string.offline_pages_free_up_space_title) + .setTitle(OfflinePageUtils.getStringId( + R.string.offline_pages_free_up_space_title)) .setPositiveButton(R.string.offline_pages_view_button, listener) .setNegativeButton(R.string.cancel, listener) - .setMessage(R.string.offline_pages_open_storage_settings_dialog_text); + .setMessage(OfflinePageUtils.getStringId( + R.string.offline_pages_open_storage_settings_dialog_text)); builder.create().show(); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java index 3bd62b2..fb5e727 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java @@ -55,7 +55,8 @@ public class OfflinePageStorageSpaceHeader { R.layout.eb_offline_pages_storage_space_header, parent, false); ((TextView) header.findViewById(R.id.storage_header_message)) - .setText(mContext.getString(R.string.offline_pages_storage_space_message, + .setText(mContext.getString( + OfflinePageUtils.getStringId(R.string.offline_pages_storage_space_message), Formatter.formatFileSize( mContext, mOfflinePageStorageSpacePolicy.getSizeOfAllPages()))); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java index bec2a47..f713d22 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java @@ -20,6 +20,7 @@ import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.bookmarks.BookmarkType; +import org.chromium.components.offlinepages.FeatureMode; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.ui.base.PageTransition; @@ -71,6 +72,66 @@ public class OfflinePageUtils { } /** + * Finds out the appropriate resource ID of UI string shown to the user. + * @param stringResId The resource ID of UI string used when 'bookmarks' name is used in UI + * strings. + * return The resource ID of UI string shown to the user, depending on the experiment. + */ + public static int getStringId(int stringResId) { + if (!OfflinePageBridge.isEnabled()) { + return stringResId; + } + if (OfflinePageBridge.getFeatureMode() != FeatureMode.ENABLED_AS_SAVED_PAGES) { + return stringResId; + } + if (stringResId == R.string.enhanced_bookmark_action_bar_delete) { + return R.string.offline_pages_action_bar_delete; + } else if (stringResId == R.string.enhanced_bookmark_action_bar_move) { + return R.string.offline_pages_action_bar_move; + } else if (stringResId == R.string.enhanced_bookmark_action_bar_search) { + return R.string.offline_pages_action_bar_search; + } else if (stringResId == R.string.edit_bookmark) { + return R.string.offline_pages_edit_item; + } else if (stringResId == R.string.enhanced_bookmark_drawer_all_items) { + return R.string.offline_pages_all_items; + } else if (stringResId == R.string.enhanced_bookmark_title_bar_all_items) { + return R.string.offline_pages_all_items; + } else if (stringResId == R.string.bookmarks) { + return R.string.offline_pages_saved_pages; + } else if (stringResId == R.string.menu_bookmarks) { + return R.string.menu_bookmarks_offline_pages; + } else if (stringResId == R.string.ntp_bookmarks) { + return R.string.offline_pages_ntp_button_name; + } else if (stringResId == R.string.accessibility_ntp_toolbar_btn_bookmarks) { + return R.string.offline_pages_ntp_button_accessibility; + } else if (stringResId == R.string.bookmarks_folder_empty) { + return R.string.offline_pages_folder_empty; + } else if (stringResId == R.string.new_tab_incognito_message) { + return R.string.offline_pages_new_tab_incognito_message; + } else if (stringResId == R.string.offline_pages_as_bookmarks_page_saved) { + return R.string.offline_pages_page_saved; + } else if (stringResId == R.string.offline_pages_as_bookmarks_page_skipped) { + return R.string.offline_pages_page_skipped; + } else if (stringResId + == R.string.offline_pages_as_bookmarks_page_saved_storage_near_full) { + return R.string.offline_pages_page_saved_storage_near_full; + } else if (stringResId == R.string.offline_pages_as_bookmarks_page_failed_to_save) { + return R.string.offline_pages_page_failed_to_save; + } else if (stringResId + == R.string.offline_pages_as_bookmarks_page_failed_to_save_storage_near_full) { + return R.string.offline_pages_page_failed_to_save_storage_near_full; + } else if (stringResId == R.string.offline_pages_as_bookmarks_storage_space_message) { + return R.string.offline_pages_storage_space_message; + } else if (stringResId == R.string.offline_pages_as_bookmarks_viewing_offline_page) { + return R.string.offline_pages_viewing_offline_page; + } else if (stringResId == R.string.offline_pages_as_bookmarks_offline_page_size) { + return R.string.bookmark_offline_page_size; + } else { + return stringResId; + } + } + + /** * Retrieves the url to launch a bookmark or saved page. If latter, also marks it as * accessed and reports the UMAs. * @@ -190,7 +251,7 @@ public class OfflinePageUtils { final long bookmarkId, final int buttonType, final int actionTextId) { Context context = activity.getBaseContext(); - final int snackbarTextId = R.string.offline_pages_viewing_offline_page; + final int snackbarTextId = getStringId(R.string.offline_pages_viewing_offline_page); SnackbarController snackbarController = new SnackbarController() { @Override diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index e50d72f..f61856a 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd @@ -2000,6 +2000,39 @@ Just open Chrome on your computer, go to the menu, and select “Sign in to Chro View </message> + <!-- Offline pages (Use 'bookmarks' name in UI strings) --> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_OFFLINE_PAGE_SIZE" desc="Label specifying that given saved page has an offline copy of a specific size (Use 'bookmarks' name in UI strings)."> + <ph name="PAGE_SIZE_STRING">%1$s<ex>1.32 MB</ex></ph> bookmark saved offline + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_OFFLINE_PAGE_VISIT" desc="Label specifying that given saved page does not have an offline copy, and user does not have that page open (Use 'bookmarks' name in UI strings)."> + Visit bookmark to save offline + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SAVED" desc="Message shown after user adds a new offline page (Use 'bookmarks' name in UI strings)."> + Bookmark saved offline + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SAVED_FOLDER" desc="Message shown after user saves a new offline page. Also specifies in which folder the bookmark was added (Use 'bookmarks' name in UI strings)."> + Bookmark saved offline to <ph name="FOLDER_NAME">%1$s<ex>Mobile bookmarks</ex></ph> + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SKIPPED" desc="Message shown after a page was saved as a bookmark, but an offline copy was not created due to that the page is not HTTP or HTTPS page (Use 'bookmarks' name in UI strings)."> + Bookmarked + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SAVED_STORAGE_NEAR_FULL" desc="Message shown after user adds a new offline page and the storage is almost full (Use 'bookmarks' name in UI strings)."> + Bookmark saved offline. Storage almost full. + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_FAILED_TO_SAVE" desc="Message shown after a page was saved as a bookmark, but an offline copy was not created due to problems other than storage (Use 'bookmarks' name in UI strings)."> + Bookmark not available offline + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_FAILED_TO_SAVE_STORAGE_NEAR_FULL" desc="Message shown after a page was saved as a bookmark, but an offline copy was not created due to storage problem (Use 'bookmarks' name in UI strings)."> + Bookmark not available offline. Storage almost full. + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_STORAGE_SPACE_MESSAGE" desc="Text explaining how much storage is currently used for offline copies of saved pages (Use 'bookmarks' name in UI strings)."> + Bookmarks are currently taking up <ph name="TOTAL_OFFLINE_STORAGE_SIZE">%1$s<ex>780 MB</ex></ph>. + </message> + <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_VIEWING_OFFLINE_PAGE" desc="Text explaining that the user is viewing an offline copy of a web page (Use 'bookmarks' name in UI strings)."> + Viewing an offline copy of this bookmark + </message> + + <!-- Find in page --> <message name="IDS_HINT_FIND_IN_PAGE" desc="Hint text to show for the find in page search field when the search field is empty."> Find in page diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageFeatureTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageFeatureTest.java new file mode 100644 index 0000000..b63e5a6 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageFeatureTest.java @@ -0,0 +1,80 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.offlinepages; + +import android.test.UiThreadTest; +import android.test.suitebuilder.annotation.SmallTest; + +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.components.offlinepages.FeatureMode; +import org.chromium.content.browser.test.NativeLibraryTestBase; + +/** Unit tests for offline pages feature. */ +public class OfflinePageFeatureTest extends NativeLibraryTestBase { + @Override + protected void setUp() throws Exception { + super.setUp(); + loadNativeLibraryAndInitBrowserProcess(); + } + + @CommandLineFlags.Add({ChromeSwitches.ENABLE_OFFLINE_PAGES_AS_BOOKMARKS}) + @SmallTest + @UiThreadTest + public void testEnableOfflinePagesAsBookmarks() throws Exception { + assertEquals(FeatureMode.ENABLED_AS_BOOKMARKS, OfflinePageBridge.getFeatureMode()); + + /** String is not updated since the experiment switch asks for the "bookmarks" version. */ + assertEquals( + R.string.menu_bookmarks, OfflinePageUtils.getStringId(R.string.menu_bookmarks)); + /** String is not updated when no mapping exists. */ + assertEquals(R.string.bookmark_offline_page_none, + OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none)); + } + + @CommandLineFlags.Add({ChromeSwitches.ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES}) + @SmallTest + @UiThreadTest + public void testEnableOfflinePagesAsSavedPages() throws Exception { + assertEquals(FeatureMode.ENABLED_AS_SAVED_PAGES, OfflinePageBridge.getFeatureMode()); + + /** String is updated when a mapping is found. */ + assertEquals(R.string.menu_bookmarks_offline_pages, + OfflinePageUtils.getStringId(R.string.menu_bookmarks)); + /** String is not updated when no mapping exists. */ + assertEquals(R.string.bookmark_offline_page_none, + OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none)); + } + + @CommandLineFlags.Add({ChromeSwitches.ENABLE_OFFLINE_PAGES}) + @SmallTest + @UiThreadTest + public void testEnableOfflinePages() throws Exception { + assertEquals(FeatureMode.ENABLED_AS_SAVED_PAGES, OfflinePageBridge.getFeatureMode()); + + /** String is not updated since the experiment switch asks for the "bookmarks" version. */ + assertEquals(R.string.menu_bookmarks_offline_pages, + OfflinePageUtils.getStringId(R.string.menu_bookmarks)); + /** String is not updated when no mapping exists. */ + assertEquals(R.string.bookmark_offline_page_none, + OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none)); + } + + @CommandLineFlags.Add({ChromeSwitches.DISABLE_OFFLINE_PAGES}) + @SmallTest + @UiThreadTest + public void testDisableOfflinePages() throws Exception { + assertEquals(FeatureMode.DISABLED, OfflinePageBridge.getFeatureMode()); + + /** Strings are not updated regardless whether the mappings exist when the feature is + * disabled. + */ + assertEquals( + R.string.menu_bookmarks, OfflinePageUtils.getStringId(R.string.menu_bookmarks)); + assertEquals(R.string.bookmark_offline_page_none, + OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none)); + } +} diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 0ccee99..2d8bfd4 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -14431,6 +14431,12 @@ Please check your email at <ph name="ACCOUNT_EMAIL">$2<ex>jane.doe@gmail.com</ex <message name="IDS_FLAGS_OFFLINE_PAGES_DESCRIPTION" desc="Description for the flag to enable offline pages."> Enable storing pages locally for offline use. </message> + <message name="IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_BOOKMARKS" desc="Option to enable offline pages feature using name 'bookmarks' shown in user-visible strings"> + Enabled as bookmarks + </message> + <message name="IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES" desc="Option to enable offline pages feature using name 'saved pages' shown in user-visible strings"> + Enabled as saved pages + </message> <message name="IDS_FLAGS_NTP_POPULAR_SITES_NAME" desc="Name for the flag to enable showing non-personalized popular suggestions on the New Tab Page, when no personal suggestions are available yet."> Show popular sites on the New Tab page </message> diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 7a40fc8..0cb7d73 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -507,6 +507,18 @@ const FeatureEntry::Choice kUpdateMenuItemSummaryChoices[] = { }; #endif // defined(OS_ANDROID) +#if defined(OS_ANDROID) +const FeatureEntry::Choice kEnableOfflinePagesChoices[] = { + {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, + {IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_BOOKMARKS, + switches::kEnableOfflinePagesAsBookmarks, ""}, + {IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES, + switches::kEnableOfflinePagesAsSavedPages, ""}, + {IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, switches::kDisableOfflinePages, + ""}, +}; +#endif // defined(OS_ANDROID) + // RECORDING USER METRICS FOR FLAGS: // ----------------------------------------------------------------------------- // The first line of the entry is the internal name. If you'd like to gather @@ -1939,12 +1951,9 @@ const FeatureEntry kFeatureEntries[] = { MULTI_VALUE_TYPE(kProgressBarAnimationChoices)}, #endif // defined(OS_ANDROID) #if defined(OS_ANDROID) - {"offline-pages", - IDS_FLAGS_OFFLINE_PAGES_NAME, - IDS_FLAGS_OFFLINE_PAGES_DESCRIPTION, - kOsAndroid, - ENABLE_DISABLE_VALUE_TYPE(switches::kEnableOfflinePages, - switches::kDisableOfflinePages)}, + {"offline-pages-mode", IDS_FLAGS_OFFLINE_PAGES_NAME, + IDS_FLAGS_OFFLINE_PAGES_DESCRIPTION, kOsAndroid, + MULTI_VALUE_TYPE(kEnableOfflinePagesChoices)}, #endif // defined(OS_ANDROID) {"low-priority-iframes", IDS_FLAGS_LOW_PRIORITY_IFRAMES_UI_NAME, diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc index 6101adc..716403c 100644 --- a/chrome/browser/android/offline_pages/offline_page_bridge.cc +++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc @@ -67,9 +67,8 @@ void ToJavaOfflinePageList(JNIEnv* env, } // namespace -static jboolean IsOfflinePagesEnabled(JNIEnv* env, - const JavaParamRef<jclass>& clazz) { - return offline_pages::IsOfflinePagesEnabled(); +static jint GetFeatureMode(JNIEnv* env, const JavaParamRef<jclass>& clazz) { + return static_cast<jint>(offline_pages::GetOfflinePageFeatureMode()); } static jboolean CanSavePage(JNIEnv* env, diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index cd50af3..b3cdde7 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -192,6 +192,7 @@ #include "chrome/common/descriptors_android.h" #include "components/crash/content/browser/crash_dump_manager_android.h" #include "components/navigation_interception/intercept_navigation_delegate.h" +#include "components/offline_pages/offline_page_switches.h" #include "ui/base/resource/resource_bundle_android.h" #elif defined(OS_POSIX) #include "chrome/browser/chrome_browser_main_posix.h" @@ -1604,6 +1605,9 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( #endif switches::kEnableNetBenchmarking, switches::kEnableNewBookmarkApps, +#if defined(OS_ANDROID) + switches::kEnableOfflinePagesAsBookmarks, +#endif switches::kJavaScriptHarmony, switches::kMessageLoopHistogrammer, switches::kPpapiFlashArgs, diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index a424f37..1ad742e 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -559,7 +559,8 @@ '../components/components.gyp:gcm_driver_java', '../components/components.gyp:invalidation_java', '../components/components.gyp:navigation_interception_java', - '../components/components.gyp:offline_pages_enums_java', + '../components/components.gyp:offline_page_feature_enums_java', + '../components/components.gyp:offline_page_model_enums_java', '../components/components.gyp:precache_java', '../components/components.gyp:safe_json_java', '../components/components.gyp:security_state_enums_java', diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 8417794..fb57a95 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn @@ -85,6 +85,7 @@ static_library("common") { "//components/metrics:net", "//components/nacl/common:process_type", "//components/nacl/common:switches", + "//components/offline_pages:switches", "//components/omnibox/common", "//components/policy:policy_component_common", "//components/strings", diff --git a/chrome/common/DEPS b/chrome/common/DEPS index 84bf958..ead1d81 100644 --- a/chrome/common/DEPS +++ b/chrome/common/DEPS @@ -16,6 +16,7 @@ include_rules = [ "+components/metrics/client_info.h", "+components/metrics/metrics_pref_names.h", "+components/nacl/common", + "+components/offline_pages/offline_page_feature.h", "+components/password_manager/core/common", "+components/printing/common", "+components/policy/core/common", diff --git a/chrome/common/localized_error.cc b/chrome/common/localized_error.cc index 8ff1643..8867eca 100644 --- a/chrome/common/localized_error.cc +++ b/chrome/common/localized_error.cc @@ -33,6 +33,10 @@ #include "base/win/windows_version.h" #endif +#if defined(OS_ANDROID) +#include "components/offline_pages/offline_page_feature.h" +#endif + using error_page::OfflinePageStatus; // Some error pages have no details. @@ -775,8 +779,11 @@ void LocalizedError::GetStrings(int error_code, OfflinePageStatus::HAS_OTHER_OFFLINE_PAGES) { base::DictionaryValue* show_offline_pages_button = new base::DictionaryValue; - base::string16 button_text = - l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES); + base::string16 button_text = l10n_util::GetStringUTF16( + offline_pages::GetOfflinePageFeatureMode() == + offline_pages::FeatureMode::ENABLED_AS_BOOKMARKS + ? IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES_AS_BOOKMARKS + : IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES); show_offline_pages_button->SetString("msg", button_text); error_strings->Set("showOfflinePagesButton", show_offline_pages_button); } diff --git a/components/error_page_strings.grdp b/components/error_page_strings.grdp index f18c2ce..8a66053 100644 --- a/components/error_page_strings.grdp +++ b/components/error_page_strings.grdp @@ -30,6 +30,9 @@ </message> </if> <if expr="is_android"> + <message name="IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES_AS_BOOKMARKS" desc="Label for the button on an error page to show bookmarks that have been saved offline"> + Show all bookmarks + </message> <message name="IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES" desc="Label for the button on an error page to show pages that have been saved offline"> Show all saved pages </message> diff --git a/components/offline_pages.gypi b/components/offline_pages.gypi index 33e34ae..6ba8033 100644 --- a/components/offline_pages.gypi +++ b/components/offline_pages.gypi @@ -70,8 +70,17 @@ ['OS == "android"', { 'targets': [ { - # GN: //components/offline_pages:offline_pages_enums_java - 'target_name': 'offline_pages_enums_java', + # GN: //components/offline_pages:offline_page_feature_enums_java + 'target_name': 'offline_page_feature_enums_java', + 'type': 'none', + 'variables': { + 'source_file': 'offline_pages/offline_page_feature.h', + }, + 'includes': [ '../build/android/java_cpp_enum.gypi' ], + }, + { + # GN: //components/offline_pages:offline_page_model_enums_java + 'target_name': 'offline_page_model_enums_java', 'type': 'none', 'variables': { 'source_file': 'offline_pages/offline_page_model.h', diff --git a/components/offline_pages/BUILD.gn b/components/offline_pages/BUILD.gn index 26f2852..88dbd1e 100644 --- a/components/offline_pages/BUILD.gn +++ b/components/offline_pages/BUILD.gn @@ -10,8 +10,6 @@ if (is_android) { static_library("offline_pages") { sources = [ "offline_page_archiver.h", - "offline_page_feature.cc", - "offline_page_feature.h", "offline_page_item.cc", "offline_page_item.h", "offline_page_metadata_store.cc", @@ -20,11 +18,10 @@ static_library("offline_pages") { "offline_page_metadata_store_impl.h", "offline_page_model.cc", "offline_page_model.h", - "offline_page_switches.cc", - "offline_page_switches.h", ] deps = [ + ":switches", "//base", "//components/bookmarks/browser", "//components/keyed_service/core", @@ -47,12 +44,26 @@ static_library("test_support") { deps = [ ":offline_pages", + ":switches", "//base", "//testing/gtest", "//url", ] } +source_set("switches") { + sources = [ + "offline_page_feature.cc", + "offline_page_feature.h", + "offline_page_switches.cc", + "offline_page_switches.h", + ] + + deps = [ + "//base", + ] +} + source_set("unit_tests") { testonly = true sources = [ @@ -75,7 +86,13 @@ source_set("unit_tests") { } if (is_android) { - java_cpp_enum("offline_pages_enums_java") { + java_cpp_enum("offline_page_feature_enums_java") { + sources = [ + "offline_page_feature.h", + ] + } + + java_cpp_enum("offline_page_model_enums_java") { sources = [ "offline_page_model.h", ] diff --git a/components/offline_pages/offline_page_feature.cc b/components/offline_pages/offline_page_feature.cc index 586ed20..60f239b8 100644 --- a/components/offline_pages/offline_page_feature.cc +++ b/components/offline_pages/offline_page_feature.cc @@ -17,22 +17,50 @@ namespace offline_pages { namespace { const char kOfflinePagesFieldTrialName[] = "OfflinePages"; -const char kOfflinePagesFieldTrialEnabledGroupName[] = "Enabled"; +// The old experiment has only one mode to enable offline pages. +const char kEnabledGroupName[] = "Enabled"; +// The new experiment supports two modes for offline pages. +const char kEnabledAsBookmarksGroupName[] = "EnabledAsBookmarks"; +const char kEnabledAsSavedPagesGroupName[] = "EnabledAsSavedPages"; } // namespace -bool IsOfflinePagesEnabled() { +FeatureMode GetOfflinePageFeatureMode() { + // The old experiment 'Enabled' defaults to showing saved page. if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableOfflinePages)) { - return true; + return FeatureMode::ENABLED_AS_SAVED_PAGES; + } + // The new experiment can control showing either bookmark or saved page. + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableOfflinePagesAsBookmarks)) { + return FeatureMode::ENABLED_AS_BOOKMARKS; + } + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableOfflinePagesAsSavedPages)) { + return FeatureMode::ENABLED_AS_SAVED_PAGES; } if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableOfflinePages)) { - return false; + return FeatureMode::DISABLED; } std::string group_name = base::FieldTrialList::FindFullName(kOfflinePagesFieldTrialName); - return group_name == kOfflinePagesFieldTrialEnabledGroupName; + // The old experiment 'Enabled' defaults to showing saved page. + if (group_name == kEnabledGroupName) + return FeatureMode::ENABLED_AS_SAVED_PAGES; + // The new experiment can control showing either bookmark or saved page. + if (group_name == kEnabledAsBookmarksGroupName) + return FeatureMode::ENABLED_AS_BOOKMARKS; + if (group_name == kEnabledAsSavedPagesGroupName) + return FeatureMode::ENABLED_AS_SAVED_PAGES; + return FeatureMode::DISABLED; +} + +bool IsOfflinePagesEnabled() { + FeatureMode mode = GetOfflinePageFeatureMode(); + return mode == FeatureMode::ENABLED_AS_BOOKMARKS || + mode == FeatureMode::ENABLED_AS_SAVED_PAGES; } } // namespace offline_pages diff --git a/components/offline_pages/offline_page_feature.h b/components/offline_pages/offline_page_feature.h index 0bf6ad2..600140f 100644 --- a/components/offline_pages/offline_page_feature.h +++ b/components/offline_pages/offline_page_feature.h @@ -11,6 +11,19 @@ namespace offline_pages { +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.offlinepages +enum class FeatureMode { + // Offline pages feature is disabled. + DISABLED, + // Offline pages feature is enabled, showing bookmarks in UI strings. + ENABLED_AS_BOOKMARKS, + // Offline pages feature is enabled, showing saved pages in UI strings. + ENABLED_AS_SAVED_PAGES +}; + +// Returns the mode where Offline Pages feature is running. +FeatureMode GetOfflinePageFeatureMode(); + // Returns true if offline pages is enabled. bool IsOfflinePagesEnabled(); diff --git a/components/offline_pages/offline_page_switches.cc b/components/offline_pages/offline_page_switches.cc index 2a24c35..e326a17 100644 --- a/components/offline_pages/offline_page_switches.cc +++ b/components/offline_pages/offline_page_switches.cc @@ -12,4 +12,12 @@ const char kEnableOfflinePages[] = "enable-offline-pages"; // Disable Offline Pages. const char kDisableOfflinePages[] = "disable-offline-pages"; +// Enable Offline Pages showing "bookmarks" in UI strings. +const char kEnableOfflinePagesAsBookmarks[] = + "enable-offline-pages-as-bookmarks"; + +// Enable Offline Pages showing "saved pages" in UI strings. +const char kEnableOfflinePagesAsSavedPages[] = + "enable-offline-pages-as-saved-pages"; + } // namespace switches diff --git a/components/offline_pages/offline_page_switches.h b/components/offline_pages/offline_page_switches.h index 4df0618..46e75c0 100644 --- a/components/offline_pages/offline_page_switches.h +++ b/components/offline_pages/offline_page_switches.h @@ -9,6 +9,8 @@ namespace switches { extern const char kEnableOfflinePages[]; extern const char kDisableOfflinePages[]; +extern const char kEnableOfflinePagesAsBookmarks[]; +extern const char kEnableOfflinePagesAsSavedPages[]; } // namespace switches diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index b9b2423..e39a5bf 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml @@ -69584,6 +69584,7 @@ To add a new entry, add it with any value and run test to compute valid value. <int value="-378033324" label="disable-win32k-renderer-lockdown"/> <int value="-360038744" label="invert-viewport-scroll-order"/> <int value="-351552989" label="disable-hosted-apps-in-windows"/> + <int value="-351127770" label="enable-offline-pages-as-bookmarks"/> <int value="-349057743" label="extensions-on-chrome-urls"/> <int value="-345838366" label="enable-hosted-apps-in-windows"/> <int value="-344343842" label="disable-experimental-app-list"/> @@ -69623,6 +69624,7 @@ To add a new entry, add it with any value and run test to compute valid value. <int value="-23090520" label="disable-search-button-in-omnibox"/> <int value="-22544408" label="enable-video-player-chromecast-support"/> <int value="-13918890" label="disable-download-notification"/> + <int value="-11260186" label="enable-offline-pages-as-saved-pages"/> <int value="-5052940" label="enable-simplified-fullscreen"/> <int value="-2371418" label="disable-display-list-2d-canvas"/> <int value="0" label="BAD_FLAG_FORMAT"> |