зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 5d1623b6bcca (bug 1328937) for continued bustage on android
This commit is contained in:
Родитель
ccd2feb7ba
Коммит
f2693baa0a
|
@ -0,0 +1,317 @@
|
|||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
package org.mozilla.gecko.home.activitystream;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Color;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewStub;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.mozilla.gecko.GeckoSharedPrefs;
|
||||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.Telemetry;
|
||||
import org.mozilla.gecko.TelemetryContract;
|
||||
import org.mozilla.gecko.activitystream.Utils;
|
||||
import org.mozilla.gecko.activitystream.ActivityStream.LabelCallback;
|
||||
import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
|
||||
import org.mozilla.gecko.db.BrowserContract;
|
||||
import org.mozilla.gecko.home.HomePager;
|
||||
import org.mozilla.gecko.home.activitystream.menu.ActivityStreamContextMenu;
|
||||
import org.mozilla.gecko.home.activitystream.topsites.CirclePageIndicator;
|
||||
import org.mozilla.gecko.home.activitystream.topsites.TopSitesPagerAdapter;
|
||||
import org.mozilla.gecko.icons.IconCallback;
|
||||
import org.mozilla.gecko.icons.IconResponse;
|
||||
import org.mozilla.gecko.icons.Icons;
|
||||
import org.mozilla.gecko.util.DrawableUtil;
|
||||
import org.mozilla.gecko.util.ViewUtil;
|
||||
import org.mozilla.gecko.util.TouchTargetUtil;
|
||||
import org.mozilla.gecko.widget.FaviconView;
|
||||
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import static org.mozilla.gecko.activitystream.ActivityStream.extractLabel;
|
||||
|
||||
public abstract class StreamItem extends RecyclerView.ViewHolder {
|
||||
private static final String LOGTAG = "GeckoStreamItem";
|
||||
|
||||
public StreamItem(View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
|
||||
public static class HighlightsTitle extends StreamItem {
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_main_highlightstitle;
|
||||
|
||||
public HighlightsTitle(final View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
|
||||
public static class WelcomePanel
|
||||
extends StreamItem
|
||||
implements View.OnClickListener {
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_main_welcomepanel;
|
||||
|
||||
public static final String PREF_WELCOME_DISMISSED = "activitystream.welcome_dismissed";
|
||||
|
||||
private final RecyclerView.Adapter<StreamItem> adapter;
|
||||
private final Context context;
|
||||
|
||||
public WelcomePanel(final View itemView, final RecyclerView.Adapter<StreamItem> adapter) {
|
||||
super(itemView);
|
||||
|
||||
this.adapter = adapter;
|
||||
this.context = itemView.getContext();
|
||||
|
||||
final SharedPreferences sharedPrefs = GeckoSharedPrefs.forApp(itemView.getContext());
|
||||
|
||||
if (!sharedPrefs.getBoolean(PREF_WELCOME_DISMISSED, false)) {
|
||||
final ViewStub welcomePanelStub = (ViewStub) itemView.findViewById(R.id.welcomepanel_stub);
|
||||
|
||||
welcomePanelStub.inflate();
|
||||
|
||||
final Button dismissButton = (Button) itemView.findViewById(R.id.dismiss_welcomepanel);
|
||||
|
||||
dismissButton.setOnClickListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
// To animate between item changes, RecyclerView keeps around the old version of the view,
|
||||
// and creates a new equivalent item (which is bound using the new data) - followed by
|
||||
// animating between those two versions. Hence we just need to make sure that
|
||||
// any future calls to onCreateViewHolder create a version of the Header Item
|
||||
// with the welcome panel hidden (i.e. we don't need to care about animations ourselves).
|
||||
// We communicate this state change via the pref.
|
||||
|
||||
final SharedPreferences sharedPrefs = GeckoSharedPrefs.forApp(context);
|
||||
|
||||
sharedPrefs.edit()
|
||||
.putBoolean(WelcomePanel.PREF_WELCOME_DISMISSED, true)
|
||||
.apply();
|
||||
|
||||
adapter.notifyItemChanged(getAdapterPosition());
|
||||
}
|
||||
}
|
||||
|
||||
public static class TopPanel extends StreamItem {
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_main_toppanel;
|
||||
|
||||
private final ViewPager topSitesPager;
|
||||
|
||||
public TopPanel(View itemView, HomePager.OnUrlOpenListener onUrlOpenListener, HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
|
||||
super(itemView);
|
||||
|
||||
topSitesPager = (ViewPager) itemView.findViewById(R.id.topsites_pager);
|
||||
topSitesPager.setAdapter(new TopSitesPagerAdapter(itemView.getContext(), onUrlOpenListener, onUrlOpenInBackgroundListener));
|
||||
|
||||
CirclePageIndicator indicator = (CirclePageIndicator) itemView.findViewById(R.id.topsites_indicator);
|
||||
indicator.setViewPager(topSitesPager);
|
||||
}
|
||||
|
||||
public void bind(Cursor cursor, int tiles, int tilesWidth, int tilesHeight) {
|
||||
final TopSitesPagerAdapter adapter = (TopSitesPagerAdapter) topSitesPager.getAdapter();
|
||||
adapter.setTilesSize(tiles, tilesWidth, tilesHeight);
|
||||
adapter.swapCursor(cursor);
|
||||
|
||||
final Resources resources = itemView.getResources();
|
||||
final int tilesMargin = resources.getDimensionPixelSize(R.dimen.activity_stream_base_margin);
|
||||
final int textHeight = resources.getDimensionPixelSize(R.dimen.activity_stream_top_sites_text_height);
|
||||
|
||||
ViewGroup.LayoutParams layoutParams = topSitesPager.getLayoutParams();
|
||||
layoutParams.height = tilesHeight + tilesMargin + textHeight;
|
||||
topSitesPager.setLayoutParams(layoutParams);
|
||||
}
|
||||
}
|
||||
|
||||
public static class HighlightItem extends StreamItem implements IconCallback {
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_card_history_item;
|
||||
|
||||
String title;
|
||||
String url;
|
||||
JSONObject metadata;
|
||||
|
||||
@Nullable Boolean isPinned;
|
||||
@Nullable Boolean isBookmarked;
|
||||
|
||||
Utils.HighlightSource source;
|
||||
|
||||
final FaviconView vIconView;
|
||||
final TextView vLabel;
|
||||
final TextView vTimeSince;
|
||||
final TextView vSourceView;
|
||||
final TextView vPageView;
|
||||
final ImageView vSourceIconView;
|
||||
|
||||
private Future<IconResponse> ongoingIconLoad;
|
||||
private int tilesMargin;
|
||||
|
||||
public HighlightItem(final View itemView,
|
||||
final HomePager.OnUrlOpenListener onUrlOpenListener,
|
||||
final HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
|
||||
super(itemView);
|
||||
|
||||
tilesMargin = itemView.getResources().getDimensionPixelSize(R.dimen.activity_stream_base_margin);
|
||||
|
||||
vLabel = (TextView) itemView.findViewById(R.id.card_history_label);
|
||||
vTimeSince = (TextView) itemView.findViewById(R.id.card_history_time_since);
|
||||
vIconView = (FaviconView) itemView.findViewById(R.id.icon);
|
||||
vSourceView = (TextView) itemView.findViewById(R.id.card_history_source);
|
||||
vPageView = (TextView) itemView.findViewById(R.id.page);
|
||||
vSourceIconView = (ImageView) itemView.findViewById(R.id.source_icon);
|
||||
|
||||
final ImageView menuButton = (ImageView) itemView.findViewById(R.id.menu);
|
||||
|
||||
menuButton.setImageDrawable(
|
||||
DrawableUtil.tintDrawable(menuButton.getContext(), R.drawable.menu, Color.LTGRAY));
|
||||
|
||||
TouchTargetUtil.ensureTargetHitArea(menuButton, itemView);
|
||||
|
||||
menuButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
ActivityStreamTelemetry.Extras.Builder extras = ActivityStreamTelemetry.Extras.builder()
|
||||
.set(ActivityStreamTelemetry.Contract.SOURCE_TYPE, ActivityStreamTelemetry.Contract.TYPE_HIGHLIGHTS)
|
||||
.forHighlightSource(source);
|
||||
|
||||
ActivityStreamContextMenu.show(v.getContext(),
|
||||
menuButton,
|
||||
extras,
|
||||
ActivityStreamContextMenu.MenuMode.HIGHLIGHT,
|
||||
title, url, isBookmarked, isPinned,
|
||||
onUrlOpenListener, onUrlOpenInBackgroundListener,
|
||||
vIconView.getWidth(), vIconView.getHeight());
|
||||
|
||||
Telemetry.sendUIEvent(
|
||||
TelemetryContract.Event.SHOW,
|
||||
TelemetryContract.Method.CONTEXT_MENU,
|
||||
extras.build()
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
ViewUtil.enableTouchRipple(menuButton);
|
||||
}
|
||||
|
||||
public void bind(Cursor cursor, int tilesWidth, int tilesHeight) {
|
||||
final long time = cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.DATE));
|
||||
final String ago = DateUtils.getRelativeTimeSpanString(time, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS, 0).toString();
|
||||
|
||||
title = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.History.TITLE));
|
||||
url = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Combined.URL));
|
||||
source = Utils.highlightSource(cursor);
|
||||
|
||||
try {
|
||||
final String rawMetadata = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.METADATA));
|
||||
if (rawMetadata != null) {
|
||||
metadata = new JSONObject(rawMetadata);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.w(LOGTAG, "JSONException while parsing page metadata", e);
|
||||
}
|
||||
|
||||
vLabel.setText(title);
|
||||
vTimeSince.setText(ago);
|
||||
|
||||
ViewGroup.LayoutParams layoutParams = vIconView.getLayoutParams();
|
||||
layoutParams.width = tilesWidth - tilesMargin;
|
||||
layoutParams.height = tilesHeight;
|
||||
vIconView.setLayoutParams(layoutParams);
|
||||
|
||||
updateStateForSource(source);
|
||||
updateUiForSource(source);
|
||||
updatePage(metadata, url);
|
||||
|
||||
if (ongoingIconLoad != null) {
|
||||
ongoingIconLoad.cancel(true);
|
||||
}
|
||||
|
||||
ongoingIconLoad = Icons.with(itemView.getContext())
|
||||
.pageUrl(url)
|
||||
.skipNetwork()
|
||||
.build()
|
||||
.execute(this);
|
||||
}
|
||||
|
||||
private void updateStateForSource(Utils.HighlightSource source) {
|
||||
// We can only be certain of bookmark state if an item is a bookmark item.
|
||||
// Otherwise, due to the underlying highlights query, we have to look up states when
|
||||
// menus are displayed.
|
||||
switch (source) {
|
||||
case BOOKMARKED:
|
||||
isBookmarked = true;
|
||||
isPinned = null;
|
||||
break;
|
||||
case VISITED:
|
||||
isBookmarked = null;
|
||||
isPinned = null;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown source: " + source);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUiForSource(Utils.HighlightSource source) {
|
||||
switch (source) {
|
||||
case BOOKMARKED:
|
||||
vSourceView.setText(R.string.activity_stream_highlight_label_bookmarked);
|
||||
vSourceView.setVisibility(View.VISIBLE);
|
||||
vSourceIconView.setImageResource(R.drawable.ic_as_bookmarked);
|
||||
break;
|
||||
case VISITED:
|
||||
vSourceView.setText(R.string.activity_stream_highlight_label_visited);
|
||||
vSourceView.setVisibility(View.VISIBLE);
|
||||
vSourceIconView.setImageResource(R.drawable.ic_as_visited);
|
||||
break;
|
||||
default:
|
||||
vSourceView.setVisibility(View.INVISIBLE);
|
||||
vSourceIconView.setImageResource(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePage(final JSONObject metadata, final String url) {
|
||||
// First try to set the provider name from the page's metadata.
|
||||
|
||||
try {
|
||||
if (metadata != null && metadata.has("provider")) {
|
||||
vPageView.setText(metadata.getString("provider"));
|
||||
return;
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
// Broken JSON? Continue with fallback.
|
||||
}
|
||||
|
||||
// If there's no provider name available then let's try to extract one from the URL.
|
||||
|
||||
extractLabel(itemView.getContext(), url, false, new LabelCallback() {
|
||||
@Override
|
||||
public void onLabelExtracted(String label) {
|
||||
vPageView.setText(TextUtils.isEmpty(label) ? url : label);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIconResponse(IconResponse response) {
|
||||
vIconView.updateImage(response);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,11 +17,10 @@ import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
|
|||
import org.mozilla.gecko.activitystream.Utils;
|
||||
import org.mozilla.gecko.db.BrowserContract;
|
||||
import org.mozilla.gecko.home.HomePager;
|
||||
import org.mozilla.gecko.home.activitystream.stream.HighlightItem;
|
||||
import org.mozilla.gecko.home.activitystream.stream.HighlightsTitle;
|
||||
import org.mozilla.gecko.home.activitystream.stream.StreamItem;
|
||||
import org.mozilla.gecko.home.activitystream.stream.TopPanel;
|
||||
import org.mozilla.gecko.home.activitystream.stream.WelcomePanel;
|
||||
import org.mozilla.gecko.home.activitystream.StreamItem.HighlightItem;
|
||||
import org.mozilla.gecko.home.activitystream.StreamItem.WelcomePanel;
|
||||
import org.mozilla.gecko.home.activitystream.StreamItem.HighlightsTitle;
|
||||
import org.mozilla.gecko.home.activitystream.StreamItem.TopPanel;
|
||||
import org.mozilla.gecko.widget.RecyclerViewClickSupport;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
|
|
@ -1,217 +0,0 @@
|
|||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko.home.activitystream.stream;
|
||||
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Color;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.Telemetry;
|
||||
import org.mozilla.gecko.TelemetryContract;
|
||||
import org.mozilla.gecko.activitystream.ActivityStream;
|
||||
import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
|
||||
import org.mozilla.gecko.activitystream.Utils;
|
||||
import org.mozilla.gecko.db.BrowserContract;
|
||||
import org.mozilla.gecko.home.HomePager;
|
||||
import org.mozilla.gecko.home.activitystream.menu.ActivityStreamContextMenu;
|
||||
import org.mozilla.gecko.icons.IconCallback;
|
||||
import org.mozilla.gecko.icons.IconResponse;
|
||||
import org.mozilla.gecko.icons.Icons;
|
||||
import org.mozilla.gecko.util.DrawableUtil;
|
||||
import org.mozilla.gecko.util.TouchTargetUtil;
|
||||
import org.mozilla.gecko.util.ViewUtil;
|
||||
import org.mozilla.gecko.widget.FaviconView;
|
||||
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import static org.mozilla.gecko.activitystream.ActivityStream.extractLabel;
|
||||
|
||||
public class HighlightItem extends StreamItem implements IconCallback {
|
||||
private static final String LOGTAG = "GeckoHighlightItem";
|
||||
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_card_history_item;
|
||||
|
||||
String title;
|
||||
String url;
|
||||
JSONObject metadata;
|
||||
|
||||
@Nullable
|
||||
Boolean isPinned;
|
||||
@Nullable Boolean isBookmarked;
|
||||
|
||||
Utils.HighlightSource source;
|
||||
|
||||
final FaviconView vIconView;
|
||||
final TextView vLabel;
|
||||
final TextView vTimeSince;
|
||||
final TextView vSourceView;
|
||||
final TextView vPageView;
|
||||
final ImageView vSourceIconView;
|
||||
|
||||
private Future<IconResponse> ongoingIconLoad;
|
||||
private int tilesMargin;
|
||||
|
||||
public HighlightItem(final View itemView,
|
||||
final HomePager.OnUrlOpenListener onUrlOpenListener,
|
||||
final HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
|
||||
super(itemView);
|
||||
|
||||
tilesMargin = itemView.getResources().getDimensionPixelSize(R.dimen.activity_stream_base_margin);
|
||||
|
||||
vLabel = (TextView) itemView.findViewById(R.id.card_history_label);
|
||||
vTimeSince = (TextView) itemView.findViewById(R.id.card_history_time_since);
|
||||
vIconView = (FaviconView) itemView.findViewById(R.id.icon);
|
||||
vSourceView = (TextView) itemView.findViewById(R.id.card_history_source);
|
||||
vPageView = (TextView) itemView.findViewById(R.id.page);
|
||||
vSourceIconView = (ImageView) itemView.findViewById(R.id.source_icon);
|
||||
|
||||
final ImageView menuButton = (ImageView) itemView.findViewById(R.id.menu);
|
||||
|
||||
menuButton.setImageDrawable(
|
||||
DrawableUtil.tintDrawable(menuButton.getContext(), R.drawable.menu, Color.LTGRAY));
|
||||
|
||||
TouchTargetUtil.ensureTargetHitArea(menuButton, itemView);
|
||||
|
||||
menuButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
ActivityStreamTelemetry.Extras.Builder extras = ActivityStreamTelemetry.Extras.builder()
|
||||
.set(ActivityStreamTelemetry.Contract.SOURCE_TYPE, ActivityStreamTelemetry.Contract.TYPE_HIGHLIGHTS)
|
||||
.forHighlightSource(source);
|
||||
|
||||
ActivityStreamContextMenu.show(v.getContext(),
|
||||
menuButton,
|
||||
extras,
|
||||
ActivityStreamContextMenu.MenuMode.HIGHLIGHT,
|
||||
title, url, isBookmarked, isPinned,
|
||||
onUrlOpenListener, onUrlOpenInBackgroundListener,
|
||||
vIconView.getWidth(), vIconView.getHeight());
|
||||
|
||||
Telemetry.sendUIEvent(
|
||||
TelemetryContract.Event.SHOW,
|
||||
TelemetryContract.Method.CONTEXT_MENU,
|
||||
extras.build()
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
ViewUtil.enableTouchRipple(menuButton);
|
||||
}
|
||||
|
||||
public void bind(Cursor cursor, int tilesWidth, int tilesHeight) {
|
||||
final long time = cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.DATE));
|
||||
final String ago = DateUtils.getRelativeTimeSpanString(time, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS, 0).toString();
|
||||
|
||||
title = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.History.TITLE));
|
||||
url = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Combined.URL));
|
||||
source = Utils.highlightSource(cursor);
|
||||
|
||||
try {
|
||||
final String rawMetadata = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.METADATA));
|
||||
if (rawMetadata != null) {
|
||||
metadata = new JSONObject(rawMetadata);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.w(LOGTAG, "JSONException while parsing page metadata", e);
|
||||
}
|
||||
|
||||
vLabel.setText(title);
|
||||
vTimeSince.setText(ago);
|
||||
|
||||
ViewGroup.LayoutParams layoutParams = vIconView.getLayoutParams();
|
||||
layoutParams.width = tilesWidth - tilesMargin;
|
||||
layoutParams.height = tilesHeight;
|
||||
vIconView.setLayoutParams(layoutParams);
|
||||
|
||||
updateStateForSource(source);
|
||||
updateUiForSource(source);
|
||||
updatePage(metadata, url);
|
||||
|
||||
if (ongoingIconLoad != null) {
|
||||
ongoingIconLoad.cancel(true);
|
||||
}
|
||||
|
||||
ongoingIconLoad = Icons.with(itemView.getContext())
|
||||
.pageUrl(url)
|
||||
.skipNetwork()
|
||||
.build()
|
||||
.execute(this);
|
||||
}
|
||||
|
||||
private void updateStateForSource(Utils.HighlightSource source) {
|
||||
// We can only be certain of bookmark state if an item is a bookmark item.
|
||||
// Otherwise, due to the underlying highlights query, we have to look up states when
|
||||
// menus are displayed.
|
||||
switch (source) {
|
||||
case BOOKMARKED:
|
||||
isBookmarked = true;
|
||||
isPinned = null;
|
||||
break;
|
||||
case VISITED:
|
||||
isBookmarked = null;
|
||||
isPinned = null;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown source: " + source);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUiForSource(Utils.HighlightSource source) {
|
||||
switch (source) {
|
||||
case BOOKMARKED:
|
||||
vSourceView.setText(R.string.activity_stream_highlight_label_bookmarked);
|
||||
vSourceView.setVisibility(View.VISIBLE);
|
||||
vSourceIconView.setImageResource(R.drawable.ic_as_bookmarked);
|
||||
break;
|
||||
case VISITED:
|
||||
vSourceView.setText(R.string.activity_stream_highlight_label_visited);
|
||||
vSourceView.setVisibility(View.VISIBLE);
|
||||
vSourceIconView.setImageResource(R.drawable.ic_as_visited);
|
||||
break;
|
||||
default:
|
||||
vSourceView.setVisibility(View.INVISIBLE);
|
||||
vSourceIconView.setImageResource(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePage(final JSONObject metadata, final String url) {
|
||||
// First try to set the provider name from the page's metadata.
|
||||
|
||||
try {
|
||||
if (metadata != null && metadata.has("provider")) {
|
||||
vPageView.setText(metadata.getString("provider"));
|
||||
return;
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
// Broken JSON? Continue with fallback.
|
||||
}
|
||||
|
||||
// If there's no provider name available then let's try to extract one from the URL.
|
||||
|
||||
extractLabel(itemView.getContext(), url, false, new ActivityStream.LabelCallback() {
|
||||
@Override
|
||||
public void onLabelExtracted(String label) {
|
||||
vPageView.setText(TextUtils.isEmpty(label) ? url : label);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIconResponse(IconResponse response) {
|
||||
vIconView.updateImage(response);
|
||||
}
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko.home.activitystream.stream;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import org.mozilla.gecko.R;
|
||||
|
||||
public class HighlightsTitle extends StreamItem {
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_main_highlightstitle;
|
||||
|
||||
public HighlightsTitle(final View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko.home.activitystream.stream;
|
||||
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
|
||||
public abstract class StreamItem extends RecyclerView.ViewHolder {
|
||||
public StreamItem(View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko.home.activitystream.stream;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.database.Cursor;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.home.HomePager;
|
||||
import org.mozilla.gecko.home.activitystream.topsites.CirclePageIndicator;
|
||||
import org.mozilla.gecko.home.activitystream.topsites.TopSitesPagerAdapter;
|
||||
|
||||
public class TopPanel extends StreamItem {
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_main_toppanel;
|
||||
|
||||
private final ViewPager topSitesPager;
|
||||
|
||||
public TopPanel(View itemView, HomePager.OnUrlOpenListener onUrlOpenListener, HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
|
||||
super(itemView);
|
||||
|
||||
topSitesPager = (ViewPager) itemView.findViewById(R.id.topsites_pager);
|
||||
topSitesPager.setAdapter(new TopSitesPagerAdapter(itemView.getContext(), onUrlOpenListener, onUrlOpenInBackgroundListener));
|
||||
|
||||
CirclePageIndicator indicator = (CirclePageIndicator) itemView.findViewById(R.id.topsites_indicator);
|
||||
indicator.setViewPager(topSitesPager);
|
||||
}
|
||||
|
||||
public void bind(Cursor cursor, int tiles, int tilesWidth, int tilesHeight) {
|
||||
final TopSitesPagerAdapter adapter = (TopSitesPagerAdapter) topSitesPager.getAdapter();
|
||||
adapter.setTilesSize(tiles, tilesWidth, tilesHeight);
|
||||
adapter.swapCursor(cursor);
|
||||
|
||||
final Resources resources = itemView.getResources();
|
||||
final int tilesMargin = resources.getDimensionPixelSize(R.dimen.activity_stream_base_margin);
|
||||
final int textHeight = resources.getDimensionPixelSize(R.dimen.activity_stream_top_sites_text_height);
|
||||
|
||||
ViewGroup.LayoutParams layoutParams = topSitesPager.getLayoutParams();
|
||||
layoutParams.height = tilesHeight + tilesMargin + textHeight;
|
||||
topSitesPager.setLayoutParams(layoutParams);
|
||||
}
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko.home.activitystream.stream;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewStub;
|
||||
import android.widget.Button;
|
||||
|
||||
import org.mozilla.gecko.GeckoSharedPrefs;
|
||||
import org.mozilla.gecko.R;
|
||||
|
||||
public class WelcomePanel extends StreamItem implements View.OnClickListener {
|
||||
public static final int LAYOUT_ID = R.layout.activity_stream_main_welcomepanel;
|
||||
|
||||
public static final String PREF_WELCOME_DISMISSED = "activitystream.welcome_dismissed";
|
||||
|
||||
private final RecyclerView.Adapter<StreamItem> adapter;
|
||||
private final Context context;
|
||||
|
||||
public WelcomePanel(final View itemView, final RecyclerView.Adapter<StreamItem> adapter) {
|
||||
super(itemView);
|
||||
|
||||
this.adapter = adapter;
|
||||
this.context = itemView.getContext();
|
||||
|
||||
final SharedPreferences sharedPrefs = GeckoSharedPrefs.forApp(itemView.getContext());
|
||||
|
||||
if (!sharedPrefs.getBoolean(PREF_WELCOME_DISMISSED, false)) {
|
||||
final ViewStub welcomePanelStub = (ViewStub) itemView.findViewById(R.id.welcomepanel_stub);
|
||||
|
||||
welcomePanelStub.inflate();
|
||||
|
||||
final Button dismissButton = (Button) itemView.findViewById(R.id.dismiss_welcomepanel);
|
||||
|
||||
dismissButton.setOnClickListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
// To animate between item changes, RecyclerView keeps around the old version of the view,
|
||||
// and creates a new equivalent item (which is bound using the new data) - followed by
|
||||
// animating between those two versions. Hence we just need to make sure that
|
||||
// any future calls to onCreateViewHolder create a version of the Header Item
|
||||
// with the welcome panel hidden (i.e. we don't need to care about animations ourselves).
|
||||
// We communicate this state change via the pref.
|
||||
|
||||
final SharedPreferences sharedPrefs = GeckoSharedPrefs.forApp(context);
|
||||
|
||||
sharedPrefs.edit()
|
||||
.putBoolean(WelcomePanel.PREF_WELCOME_DISMISSED, true)
|
||||
.apply();
|
||||
|
||||
adapter.notifyItemChanged(getAdapterPosition());
|
||||
}
|
||||
}
|
|
@ -470,11 +470,7 @@ gbjar.sources += ['java/org/mozilla/gecko/' + x for x in [
|
|||
'home/activitystream/menu/ActivityStreamContextMenu.java',
|
||||
'home/activitystream/menu/BottomSheetContextMenu.java',
|
||||
'home/activitystream/menu/PopupContextMenu.java',
|
||||
'home/activitystream/stream/HighlightItem.java',
|
||||
'home/activitystream/stream/HighlightsTitle.java',
|
||||
'home/activitystream/stream/StreamItem.java',
|
||||
'home/activitystream/stream/TopPanel.java',
|
||||
'home/activitystream/stream/WelcomePanel.java',
|
||||
'home/activitystream/StreamItem.java',
|
||||
'home/activitystream/StreamRecyclerAdapter.java',
|
||||
'home/activitystream/topsites/CirclePageIndicator.java',
|
||||
'home/activitystream/topsites/TopSitesCard.java',
|
||||
|
|
Загрузка…
Ссылка в новой задаче