Index: chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java |
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 9333a7c9575e7ef45edf2aab3bc6f70fff26c773..3ffb456f354fc4ab4b2271103b2d230a54aa0596 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 |
@@ -4,14 +4,12 @@ |
package org.chromium.chrome.browser.offlinepages; |
-import android.app.Activity; |
import android.content.Context; |
import android.content.Intent; |
import android.content.IntentFilter; |
import android.os.BatteryManager; |
import android.os.Environment; |
-import org.chromium.base.Callback; |
import org.chromium.base.Log; |
import org.chromium.base.metrics.RecordHistogram; |
import org.chromium.base.metrics.RecordUserAction; |
@@ -22,8 +20,9 @@ import org.chromium.chrome.browser.snackbar.SnackbarManager; |
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; |
import org.chromium.chrome.browser.tab.Tab; |
import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
-import org.chromium.components.offlinepages.FeatureMode; |
+import org.chromium.components.bookmarks.BookmarkId; |
import org.chromium.content_public.browser.LoadUrlParams; |
+import org.chromium.content_public.browser.WebContents; |
import org.chromium.net.ConnectionType; |
import org.chromium.net.NetworkChangeNotifier; |
import org.chromium.ui.base.PageTransition; |
@@ -55,80 +54,53 @@ public class OfflinePageUtils { |
} |
/** |
- * Returns true if the stoarge is almost full which indicates that the user probably needs to |
- * free up some space. |
- */ |
- public static boolean isStorageAlmostFull() { |
- return getFreeSpaceInBytes() < STORAGE_ALMOST_FULL_THRESHOLD_BYTES; |
- } |
- |
- /** |
* Returns true if the network is connected. |
*/ |
public static boolean isConnected() { |
return NetworkChangeNotifier.isOnline(); |
} |
+ /* |
+ * Save an offline copy for the bookmarked page asynchronously. |
+ * |
+ * @param bookmarkId The ID of the page to save an offline copy. |
+ * @param tab A {@link Tab} object. |
+ * @param callback The callback to be invoked when the offline copy is saved. |
+ */ |
+ public static void saveBookmarkOffline(BookmarkId bookmarkId, Tab tab) { |
+ // If bookmark ID is missing there is nothing to save here. |
+ if (bookmarkId == null) return; |
+ |
+ // Making sure the feature is enabled. |
+ if (!OfflinePageBridge.isEnabled()) return; |
+ |
+ // Making sure tab is worth keeping. |
+ if (shouldSkipSavingTabOffline(tab)) return; |
+ |
+ OfflinePageBridge offlinePageBridge = OfflinePageBridge.getForProfile(tab.getProfile()); |
+ if (offlinePageBridge == null) return; |
+ |
+ WebContents webContents = tab.getWebContents(); |
+ ClientId clientId = ClientId.createClientIdForBookmarkId(bookmarkId); |
+ |
+ // TODO(fgorski): Ensure that request is queued if the model is not loaded. |
+ offlinePageBridge.savePage(webContents, clientId, new OfflinePageBridge.SavePageCallback() { |
+ @Override |
+ public void onSavePageDone(int savePageResult, String url, long offlineId) { |
+ // TODO(fgorski): Decide if we need to do anything with result. |
+ // Perhaps some UMA reporting, but that can really happen someplace else. |
+ } |
+ }); |
+ } |
+ |
/** |
- * 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. |
+ * Indicates whether we should skip saving the given tab as an offline page. |
+ * A tab shouldn't be saved offline if it shows an error page or a sad tab page. |
*/ |
- 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.bookmark_action_bar_delete) { |
- return R.string.offline_pages_action_bar_delete; |
- } else if (stringResId == R.string.bookmark_action_bar_move) { |
- return R.string.offline_pages_action_bar_move; |
- } else if (stringResId == R.string.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.bookmark_drawer_all_items) { |
- return R.string.offline_pages_all_items; |
- } else if (stringResId == R.string.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_saved_folder) { |
- return R.string.offline_pages_page_saved_folder; |
- } 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; |
- } |
+ private static boolean shouldSkipSavingTabOffline(Tab tab) { |
+ WebContents webContents = tab.getWebContents(); |
+ return tab.isShowingErrorPage() || tab.isShowingSadTab() || webContents == null |
+ || webContents.isDestroyed() || webContents.isIncognito(); |
} |
/** |
@@ -190,69 +162,16 @@ public class OfflinePageUtils { |
if (tabId == Tab.INVALID_TAB_ID) return; |
Log.d(TAG, "showReloadSnackbar called with controller " + snackbarController); |
- final int snackbarTextId = getStringId(R.string.offline_pages_viewing_offline_page); |
- Snackbar snackbar = Snackbar.make(context.getString(snackbarTextId), snackbarController, |
- Snackbar.TYPE_ACTION) |
- .setSingleLine(false) |
- .setAction(context.getString(R.string.reload), tabId); |
+ Snackbar snackbar = |
+ Snackbar.make(context.getString(R.string.offline_pages_viewing_offline_page), |
+ snackbarController, Snackbar.TYPE_ACTION) |
+ .setSingleLine(false) |
+ .setAction(context.getString(R.string.reload), tabId); |
snackbar.setDuration(SNACKBAR_DURATION); |
snackbarManager.showSnackbar(snackbar); |
} |
/** |
- * Creates a snackbar controller for a case where "Free up space" button is shown to clean up |
- * space taken by the offline pages. |
- */ |
- public static SnackbarController createSnackbarControllerForFreeUpSpaceButton( |
- final OfflinePageBridge offlinePageBridge, final SnackbarManager snackbarManager, |
- final Activity activity) { |
- return new SnackbarController() { |
- @Override |
- public void onDismissNoAction(Object actionData) { |
- // This method will be called only if the snackbar is dismissed by timeout. |
- RecordUserAction.record( |
- "OfflinePages.SaveStatusSnackbar.FreeUpSpaceButtonNotClicked"); |
- } |
- |
- @Override |
- public void onAction(Object actionData) { |
- RecordUserAction.record("OfflinePages.SaveStatusSnackbar.FreeUpSpaceButtonClicked"); |
- Callback<OfflinePageStorageSpacePolicy> callback = |
- getStorageSpacePolicyCallback(offlinePageBridge, snackbarManager, activity); |
- |
- OfflinePageStorageSpacePolicy.create(offlinePageBridge, callback); |
- } |
- }; |
- } |
- |
- private static Callback<OfflinePageStorageSpacePolicy> getStorageSpacePolicyCallback( |
- final OfflinePageBridge offlinePageBridge, final SnackbarManager snackbarManager, |
- final Activity activity) { |
- return new Callback<OfflinePageStorageSpacePolicy>() { |
- @Override |
- public void onResult(OfflinePageStorageSpacePolicy policy) { |
- if (policy.hasPagesToCleanUp()) { |
- OfflinePageFreeUpSpaceCallback callback = new OfflinePageFreeUpSpaceCallback() { |
- @Override |
- public void onFreeUpSpaceDone() { |
- snackbarManager.showSnackbar( |
- OfflinePageFreeUpSpaceDialog.createStorageClearedSnackbar( |
- activity)); |
- } |
- @Override |
- public void onFreeUpSpaceCancelled() {} |
- }; |
- OfflinePageFreeUpSpaceDialog dialog = |
- OfflinePageFreeUpSpaceDialog.newInstance(offlinePageBridge, callback); |
- dialog.show(activity.getFragmentManager(), null); |
- } else { |
- OfflinePageOpenStorageSettingsDialog.showDialog(activity); |
- } |
- } |
- }; |
- } |
- |
- /** |
* Gets a snackbar controller that we can use to show our snackbar. |
* @param tabModelSelector used to retrieve a tab by ID |
*/ |