Bug 1246239 - Show "saved offline" snackbar when readermode page is bookmarked r=sebastian

MozReview-Commit-ID: IC33HwSClcI

--HG--
extra : rebase_source : 673e2632a433366fb1c3fd18eeba0080399fd6b6
This commit is contained in:
Andrzej Hunt 2016-04-12 16:18:50 -07:00
parent 67a2976dc3
commit e2de073003
7 changed files with 97 additions and 12 deletions

View File

@ -7,16 +7,16 @@ package org.mozilla.gecko;
import android.Manifest;
import android.app.DownloadManager;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.WorkerThread;
import org.json.JSONArray;
import org.mozilla.gecko.adjust.AdjustHelperInterface;
import org.mozilla.gecko.annotation.RobocopTarget;
import org.mozilla.gecko.AppConstants.Versions;
import org.mozilla.gecko.DynamicToolbar.VisibilityTransition;
import org.mozilla.gecko.GeckoProfileDirectories.NoMozillaDirectoryException;
import org.mozilla.gecko.Tabs.TabEvents;
import org.mozilla.gecko.animation.PropertyAnimator;
import org.mozilla.gecko.animation.ViewHelper;
@ -25,10 +25,8 @@ import org.mozilla.gecko.db.BrowserContract;
import org.mozilla.gecko.db.BrowserDB;
import org.mozilla.gecko.db.SuggestedSites;
import org.mozilla.gecko.distribution.Distribution;
import org.mozilla.gecko.distribution.Distribution.DistributionDescriptor;
import org.mozilla.gecko.distribution.DistributionStoreCallback;
import org.mozilla.gecko.dlc.DownloadContentService;
import org.mozilla.gecko.dlc.catalog.DownloadContent;
import org.mozilla.gecko.favicons.Favicons;
import org.mozilla.gecko.favicons.OnFaviconLoadedListener;
import org.mozilla.gecko.favicons.decoders.IconDirectoryEntry;
@ -86,6 +84,7 @@ import org.mozilla.gecko.trackingprotection.TrackingProtectionPrompt;
import org.mozilla.gecko.updater.UpdateServiceHelper;
import org.mozilla.gecko.util.ActivityUtils;
import org.mozilla.gecko.util.Clipboard;
import org.mozilla.gecko.util.DrawableUtil;
import org.mozilla.gecko.util.EventCallback;
import org.mozilla.gecko.util.Experiments;
import org.mozilla.gecko.util.FloatUtils;
@ -130,6 +129,7 @@ import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.MenuItemCompat;
import android.text.TextUtils;
import android.util.AttributeSet;
@ -363,7 +363,15 @@ public class BrowserApp extends GeckoApp
tab.loadFavicon();
break;
case BOOKMARK_ADDED:
// We always show the special offline snackbar whenever we bookmark a reader page.
// It's possible that the page is already stored offline, however this is highly
// unlikely, and even so it is probably nicer to show the same offline notification
// every time we bookmark an about:reader page.
if (!AboutPages.isAboutReader(tab.getURL())) {
showBookmarkAddedSnackbar();
} else {
showReaderModeBookmarkAddedSnackbar();
}
break;
case BOOKMARK_REMOVED:
showBookmarkRemovedSnackbar();
@ -442,6 +450,26 @@ public class BrowserApp extends GeckoApp
callback);
}
private void showReaderModeBookmarkAddedSnackbar() {
final Drawable iconDownloaded = DrawableUtil.tintDrawable(getContext(), R.drawable.status_icon_readercache, Color.WHITE);
final SnackbarHelper.SnackbarCallback callback = new SnackbarHelper.SnackbarCallback() {
@Override
public void onClick(View v) {
openUrlAndStopEditing("about:home?panel=" + HomeConfig.getIdForBuiltinPanelType(PanelType.BOOKMARKS));
}
};
SnackbarHelper.showSnackbarWithActionAndColors(this,
getResources().getString(R.string.reader_saved_offline),
Snackbar.LENGTH_LONG,
getResources().getString(R.string.reader_switch_to_bookmarks),
callback,
iconDownloaded,
ContextCompat.getColor(this, R.color.link_blue),
Color.WHITE);
}
private void showBookmarkRemovedSnackbar() {
SnackbarHelper.showSnackbar(this, getResources().getString(R.string.bookmark_removed), Snackbar.LENGTH_LONG);
}

View File

@ -9,10 +9,14 @@ import org.mozilla.gecko.util.EventCallback;
import org.mozilla.gecko.util.NativeJSObject;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
import java.lang.ref.WeakReference;
@ -98,15 +102,46 @@ public class SnackbarHelper {
* @param callback Callback to be invoked when the action is clicked or the snackbar is dismissed.
*/
public static void showSnackbarWithAction(Activity activity, String message, int duration, String action, SnackbarCallback callback) {
showSnackbarWithActionAndColors(activity, message, duration, action, callback, null, null, null);
}
public static void showSnackbarWithActionAndColors(Activity activity,
String message,
int duration,
String action,
SnackbarCallback callback,
Drawable icon,
Integer backgroundColor,
Integer actionColor) {
final View parentView = findBestParentView(activity);
final Snackbar snackbar = Snackbar.make(parentView, message, duration);
if (callback != null && !TextUtils.isEmpty(action)) {
snackbar.setAction(action, callback);
snackbar.setActionTextColor(ContextCompat.getColor(activity, R.color.fennec_ui_orange));
if (actionColor == null) {
ContextCompat.getColor(activity, R.color.fennec_ui_orange);
} else {
snackbar.setActionTextColor(actionColor);
}
snackbar.setCallback(callback);
}
if (icon != null) {
int leftPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, activity.getResources().getDisplayMetrics());
final InsetDrawable paddedIcon = new InsetDrawable(icon, 0, 0, leftPadding, 0);
paddedIcon.setBounds(0, 0, leftPadding + icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
TextView textView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
textView.setCompoundDrawables(paddedIcon, null, null, null);
}
if (backgroundColor != null) {
snackbar.getView().setBackgroundColor(backgroundColor);
}
snackbar.show();
synchronized (currentSnackbarLock) {

View File

@ -145,7 +145,7 @@ class SearchEngineRow extends AnimatedHeightLayout {
mUserEnteredView.setOnClickListener(mClickListener);
mUserEnteredTextView = (TextView) findViewById(R.id.suggestion_text);
mSearchHistorySuggestionIcon = DrawableUtil.tintDrawable(getContext(), R.drawable.icon_most_recent_empty, R.color.tabs_tray_icon_grey);
mSearchHistorySuggestionIcon = DrawableUtil.tintDrawableWithColorRes(getContext(), R.drawable.icon_most_recent_empty, R.color.tabs_tray_icon_grey);
// Suggestion limits
mMaxSavedSuggestions = getResources().getInteger(R.integer.max_saved_suggestions);

View File

@ -150,10 +150,10 @@ public class ToolbarEditLayout extends ThemedLinearLayout {
final int searchDrawableId = R.drawable.search_icon_active;
final Drawable searchDrawable;
if (!isActive) {
searchDrawable = DrawableUtil.tintDrawable(getContext(), searchDrawableId, R.color.placeholder_grey);
searchDrawable = DrawableUtil.tintDrawableWithColorRes(getContext(), searchDrawableId, R.color.placeholder_grey);
} else {
if (isPrivateMode()) {
searchDrawable = DrawableUtil.tintDrawable(getContext(), searchDrawableId, R.color.tabs_tray_icon_grey);
searchDrawable = DrawableUtil.tintDrawableWithColorRes(getContext(), searchDrawableId, R.color.tabs_tray_icon_grey);
} else {
searchDrawable = getResources().getDrawable(searchDrawableId);
}

View File

@ -7,8 +7,10 @@ package org.mozilla.gecko.util;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.annotation.CheckResult;
import android.support.annotation.ColorInt;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
@ -21,14 +23,25 @@ public class DrawableUtil {
* Tints the given drawable with the given color and returns it.
*/
@CheckResult
public static Drawable tintDrawable(@NonNull final Context context, @DrawableRes final int drawableID,
@ColorRes final int colorID) {
public static Drawable tintDrawable(@NonNull final Context context,
@DrawableRes final int drawableID,
@ColorInt final int color) {
final Drawable icon = DrawableCompat.wrap(
ContextCompat.getDrawable(context, drawableID).mutate());
DrawableCompat.setTint(icon, ContextCompat.getColor(context, colorID));
DrawableCompat.setTint(icon, color);
return icon;
}
/**
* Tints the given drawable with the given color and returns it.
*/
@CheckResult
public static Drawable tintDrawableWithColorRes(@NonNull final Context context,
@DrawableRes final int drawableID,
@ColorRes final int colorID) {
return tintDrawable(context, drawableID, ContextCompat.getColor(context, colorID));
}
/**
* Tints the given drawable with the given tint list and returns it. Note that you
* should no longer use the argument Drawable because the argument is not mutated

View File

@ -70,6 +70,12 @@
<!ENTITY screenshot_folder_label_in_bookmarks "Screenshots">
<!ENTITY readinglist_smartfolder_label_in_bookmarks "Reading List">
<!ENTITY reader_saved_offline "Saved offline">
<!-- Localization note (reader_switch_to_bookmarks) : This
string is used as an action in a snackbar - it lets you
"switch" to the bookmarks (saved items) panel. -->
<!ENTITY reader_switch_to_bookmarks "Switch">
<!ENTITY history_today_section "Today">
<!ENTITY history_yesterday_section "Yesterday">
<!ENTITY history_week_section3 "Last 7 days">

View File

@ -92,6 +92,9 @@
<string name="screenshot_folder_label_in_bookmarks">&screenshot_folder_label_in_bookmarks;</string>
<string name="readinglist_smartfolder_label_in_bookmarks">&readinglist_smartfolder_label_in_bookmarks;</string>
<string name="reader_saved_offline">&reader_saved_offline;</string>
<string name="reader_switch_to_bookmarks">&reader_switch_to_bookmarks;</string>
<string name="history_today_section">&history_today_section;</string>
<string name="history_yesterday_section">&history_yesterday_section;</string>
<string name="history_week_section">&history_week_section3;</string>