jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/388126 )
Change subject: Randomizr (ready to go).
......................................................................
Randomizr (ready to go).
Bug: T158788
Change-Id: I51d1799ca5b7557c89d5fa92d2ea135b9c44187a
---
M app/src/main/AndroidManifest.xml
A app/src/main/java/android/support/v4/view/ViewPagerWithVelocity.java
M app/src/main/java/org/wikipedia/feed/FeedFragment.java
M app/src/main/java/org/wikipedia/feed/random/RandomCardView.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
A app/src/main/java/org/wikipedia/random/BottomViewBehavior.java
A app/src/main/java/org/wikipedia/random/RandomActivity.java
M app/src/main/java/org/wikipedia/random/RandomArticleRequestHandler.java
A app/src/main/java/org/wikipedia/random/RandomFragment.java
A app/src/main/java/org/wikipedia/random/RandomItemFragment.java
M app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
M app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
M app/src/main/java/org/wikipedia/util/FeedbackUtil.java
A app/src/main/res/drawable/ic_replay_black_24dp.xml
A app/src/main/res/layout-land/fragment_random.xml
M app/src/main/res/layout/fragment_page.xml
A app/src/main/res/layout/fragment_random.xml
A app/src/main/res/layout/fragment_random_item.xml
M app/src/main/res/values/strings_no_translate.xml
M app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.java
20 files changed, 687 insertions(+), 89 deletions(-)
Approvals:
jenkins-bot: Verified
Cooltey: Looks good to me, approved
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8448bf2..5843b8f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -240,6 +240,10 @@
android:label="@string/feed_configure_activity_title"
android:theme="@style/AppTheme.ActionBar"/>
+ <activity android:name=".random.RandomActivity"
+ android:label="@string/view_random_card_title"
+ android:theme="@style/AppTheme.ActionBar"/>
+
<provider
android:authorities="${applicationId}"
android:name=".database.AppContentProvider"
diff --git
a/app/src/main/java/android/support/v4/view/ViewPagerWithVelocity.java
b/app/src/main/java/android/support/v4/view/ViewPagerWithVelocity.java
new file mode 100644
index 0000000..5aba1eb
--- /dev/null
+++ b/app/src/main/java/android/support/v4/view/ViewPagerWithVelocity.java
@@ -0,0 +1,21 @@
+package android.support.v4.view;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+public class ViewPagerWithVelocity extends ViewPager {
+ private static final int VELOCITY = 1000;
+
+ public ViewPagerWithVelocity(Context context) {
+ super(context);
+ }
+
+ public ViewPagerWithVelocity(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ void setCurrentItemInternal(int item, boolean smoothScroll, boolean
always) {
+ setCurrentItemInternal(item, smoothScroll, always, VELOCITY);
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
index e40b2f0..3ef0cbe 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
@@ -7,6 +7,7 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
+import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
@@ -39,9 +40,11 @@
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.offline.LocalCompilationsActivity;
import org.wikipedia.offline.OfflineTutorialActivity;
+import org.wikipedia.random.RandomActivity;
import org.wikipedia.readinglist.sync.ReadingListSynchronizer;
import org.wikipedia.settings.Prefs;
import org.wikipedia.settings.SettingsActivity;
+import org.wikipedia.util.DeviceUtil;
import org.wikipedia.util.FeedbackUtil;
import org.wikipedia.util.ResourceUtil;
import org.wikipedia.util.ThrowableUtil;
@@ -447,6 +450,17 @@
}
@Override
+ public void onRandomClick(@NonNull RandomCardView view) {
+ if (!DeviceUtil.isOnline()) {
+ view.getRandomPage();
+ } else {
+ ActivityOptionsCompat options = ActivityOptionsCompat.
+ makeSceneTransitionAnimation(getActivity(), view,
getString(R.string.transition_random_activity));
+ startActivity(RandomActivity.newIntent(getActivity()),
options.toBundle());
+ }
+ }
+
+ @Override
public void onGetRandomError(@NonNull Throwable t, @NonNull final
RandomCardView view) {
Snackbar snackbar = FeedbackUtil.makeSnackbar(getActivity(),
ThrowableUtil.isOffline(t)
? getString(R.string.view_wiki_error_message_offline) :
t.getMessage(),
diff --git a/app/src/main/java/org/wikipedia/feed/random/RandomCardView.java
b/app/src/main/java/org/wikipedia/feed/random/RandomCardView.java
index 16a179d..60437f8 100644
--- a/app/src/main/java/org/wikipedia/feed/random/RandomCardView.java
+++ b/app/src/main/java/org/wikipedia/feed/random/RandomCardView.java
@@ -1,6 +1,7 @@
package org.wikipedia.feed.random;
import android.content.Context;
+import android.os.Build;
import android.support.annotation.NonNull;
import android.view.View;
@@ -12,11 +13,15 @@
public class RandomCardView extends StaticCardView<RandomCard> {
public interface Callback {
+ void onRandomClick(@NonNull RandomCardView view);
void onGetRandomError(@NonNull Throwable t, @NonNull RandomCardView
view);
}
public RandomCardView(@NonNull Context context) {
super(context);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ setTransitionName(getString(R.string.transition_random_activity));
+ }
}
@Override public void setCard(@NonNull RandomCard card) {
@@ -29,11 +34,15 @@
}
protected void onContentClick(View v) {
- getRandomPage();
+ if (getCallback() != null) {
+ getCallback().onRandomClick(RandomCardView.this);
+ }
}
protected void onActionClick(View v) {
- getRandomPage();
+ if (getCallback() != null) {
+ getCallback().onRandomClick(RandomCardView.this);
+ }
}
public void getRandomPage() {
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index a833e22..2df6513 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -11,8 +11,6 @@
import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetDialog;
import android.support.design.widget.BottomSheetDialogFragment;
-import android.support.design.widget.FloatingActionButton;
-import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
@@ -63,7 +61,6 @@
import org.wikipedia.page.shareafact.ShareHandler;
import org.wikipedia.page.tabs.Tab;
import org.wikipedia.page.tabs.TabsProvider;
-import org.wikipedia.random.RandomArticleRequestHandler;
import org.wikipedia.readinglist.AddToReadingListDialog;
import org.wikipedia.readinglist.ReadingList;
import org.wikipedia.readinglist.ReadingListBookmarkMenu;
@@ -162,7 +159,6 @@
private WikiDrawerLayout tocDrawer;
private ConfigurableTabLayout tabLayout;
private ToCHandler tocHandler;
- private FloatingActionButton randomButton;
private CommunicationBridge bridge;
private DarkModeSwitch darkModeSwitch;
@@ -322,19 +318,10 @@
errorView = rootView.findViewById(R.id.page_error);
- randomButton = rootView.findViewById(R.id.page_random_button);
- FeedbackUtil.setToolbarButtonLongPressToast(randomButton);
- randomButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- loadRandomPage();
- }
- });
-
bottomContentView = rootView.findViewById(R.id.page_bottom_view);
PageActionToolbarHideHandler pageActionToolbarHideHandler
- = new PageActionToolbarHideHandler(tabLayout, randomButton);
+ = new PageActionToolbarHideHandler(tabLayout, null);
pageActionToolbarHideHandler.setScrollView(webView);
return rootView;
@@ -712,14 +699,6 @@
pageFragmentLoadState.load(pushBackStack, stagedScrollY);
bottomContentView.hide();
updateBookmarkAndMenuOptions();
-
- if (entry.getSource() == HistoryEntry.SOURCE_RANDOM
- || entry.getSource() == HistoryEntry.SOURCE_FEED_RANDOM
- || entry.getSource() ==
HistoryEntry.SOURCE_APP_SHORTCUT_RANDOM) {
- randomButton.show();
- } else {
- randomButton.hide();
- }
}
public Bitmap getLeadImageBitmap() {
@@ -1033,40 +1012,6 @@
bookmarkTab.setIcon(pageSaved ? R.drawable.ic_bookmark_white_24dp
: R.drawable.ic_bookmark_border_white_24dp);
}
- }
-
- private void loadRandomPage() {
- updateProgressBar(true, true, 0);
- randomButton.hide();
- RandomArticleRequestHandler.getRandomPage(new
RandomArticleRequestHandler.Callback() {
- @Override
- public void onSuccess(@NonNull PageTitle pageTitle) {
- if (!isAdded()) {
- return;
- }
- updateProgressBar(false, true, 0);
- loadPage(pageTitle, new HistoryEntry(pageTitle,
HistoryEntry.SOURCE_RANDOM));
- }
-
- @Override
- public void onError(Throwable t) {
- if (!isAdded()) {
- return;
- }
- updateProgressBar(false, true, 0);
- randomButton.show();
- Snackbar snackbar = FeedbackUtil.makeSnackbar(getActivity(),
ThrowableUtil.isOffline(t)
- ?
getString(R.string.view_wiki_error_message_offline) : t.getMessage(),
- FeedbackUtil.LENGTH_DEFAULT);
- snackbar.setAction(R.string.page_error_retry, new
View.OnClickListener() {
- @Override
- public void onClick(View v) {
- loadRandomPage();
- }
- });
- snackbar.show();
- }
- });
}
private void showContentIssues() {
diff --git a/app/src/main/java/org/wikipedia/random/BottomViewBehavior.java
b/app/src/main/java/org/wikipedia/random/BottomViewBehavior.java
new file mode 100644
index 0000000..d603106
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/random/BottomViewBehavior.java
@@ -0,0 +1,26 @@
+package org.wikipedia.random;
+
+import android.content.Context;
+import android.support.design.widget.CoordinatorLayout;
+import android.support.design.widget.Snackbar;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class BottomViewBehavior extends CoordinatorLayout.Behavior<ViewGroup> {
+ public BottomViewBehavior(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public boolean layoutDependsOn(CoordinatorLayout parent, ViewGroup child,
View dependency) {
+ return dependency instanceof Snackbar.SnackbarLayout;
+ }
+
+ @Override
+ public boolean onDependentViewChanged(CoordinatorLayout parent, ViewGroup
child, View dependency) {
+ float translationY = Math.min(0, dependency.getTranslationY() -
dependency.getHeight());
+ child.setTranslationY(translationY);
+ return true;
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/random/RandomActivity.java
b/app/src/main/java/org/wikipedia/random/RandomActivity.java
new file mode 100644
index 0000000..b2249b9
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/random/RandomActivity.java
@@ -0,0 +1,25 @@
+package org.wikipedia.random;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+
+import org.wikipedia.activity.SingleFragmentActivity;
+
+public class RandomActivity extends SingleFragmentActivity<RandomFragment> {
+ public static Intent newIntent(@NonNull Context context) {
+ return new Intent(context, RandomActivity.class);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getSupportActionBar().setElevation(0f);
+ }
+
+ @Override
+ public RandomFragment createFragment() {
+ return RandomFragment.newInstance();
+ }
+}
diff --git
a/app/src/main/java/org/wikipedia/random/RandomArticleRequestHandler.java
b/app/src/main/java/org/wikipedia/random/RandomArticleRequestHandler.java
index 919abbd..ac305eb 100644
--- a/app/src/main/java/org/wikipedia/random/RandomArticleRequestHandler.java
+++ b/app/src/main/java/org/wikipedia/random/RandomArticleRequestHandler.java
@@ -22,7 +22,8 @@
public static void getRandomPage(@NonNull final Callback cb) {
new
RandomSummaryClient().request(WikipediaApp.getInstance().getWikiSite(), new
RandomSummaryClient.Callback() {
@Override
- public void onSuccess(@NonNull Call<RbPageSummary> call, @NonNull
PageTitle title) {
+ public void onSuccess(@NonNull Call<RbPageSummary> call, @NonNull
RbPageSummary pageSummary) {
+ PageTitle title = new PageTitle(null, pageSummary.getTitle(),
WikipediaApp.getInstance().getWikiSite());
cb.onSuccess(title);
}
diff --git a/app/src/main/java/org/wikipedia/random/RandomFragment.java
b/app/src/main/java/org/wikipedia/random/RandomFragment.java
new file mode 100644
index 0000000..d822a1f
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/random/RandomFragment.java
@@ -0,0 +1,204 @@
+package org.wikipedia.random;
+
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import org.wikipedia.R;
+import org.wikipedia.concurrency.CallbackTask;
+import org.wikipedia.history.HistoryEntry;
+import org.wikipedia.page.ExclusiveBottomSheetPresenter;
+import org.wikipedia.page.PageActivity;
+import org.wikipedia.page.PageTitle;
+import org.wikipedia.readinglist.AddToReadingListDialog;
+import org.wikipedia.readinglist.ReadingList;
+import org.wikipedia.readinglist.page.ReadingListPage;
+import org.wikipedia.readinglist.page.database.ReadingListDaoProxy;
+import org.wikipedia.util.DimenUtil;
+import org.wikipedia.util.FeedbackUtil;
+import org.wikipedia.util.ShareUtil;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import butterknife.Unbinder;
+
+public class RandomFragment extends Fragment {
+ @BindView(R.id.random_item_pager) ViewPager randomPager;
+ @BindView(R.id.random_next_button) View nextButton;
+ @BindView(R.id.random_save_button) ImageView saveShareButton;
+ @BindView(R.id.random_back_button) View backButton;
+ private Unbinder unbinder;
+ private ExclusiveBottomSheetPresenter bottomSheetPresenter = new
ExclusiveBottomSheetPresenter();
+ private boolean saveShareButtonState;
+ private ViewPagerListener viewPagerListener = new ViewPagerListener();
+
+ @NonNull
+ public static RandomFragment newInstance() {
+ return new RandomFragment();
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ View view = inflater.inflate(R.layout.fragment_random, container,
false);
+ unbinder = ButterKnife.bind(this, view);
+ FeedbackUtil.setToolbarButtonLongPressToast(nextButton,
saveShareButton);
+
+ randomPager.setOffscreenPageLimit(2);
+ randomPager.setAdapter(new RandomItemAdapter((AppCompatActivity)
getActivity()));
+ randomPager.setPageTransformer(true, new RandomPagerTransformer());
+ randomPager.addOnPageChangeListener(viewPagerListener);
+
+ updateBackButton(0);
+ return view;
+ }
+
+ @Override
+ public void onDestroyView() {
+ randomPager.removeOnPageChangeListener(viewPagerListener);
+ unbinder.unbind();
+ unbinder = null;
+ super.onDestroyView();
+ }
+
+ @OnClick(R.id.random_next_button) void onNextClick() {
+ randomPager.setCurrentItem(randomPager.getCurrentItem() + 1, true);
+ }
+
+ @OnClick(R.id.random_back_button) void onBacklick() {
+ if (randomPager.getCurrentItem() > 0) {
+ randomPager.setCurrentItem(randomPager.getCurrentItem() - 1, true);
+ }
+ }
+
+ @OnClick(R.id.random_save_button) void onSaveShareClick() {
+ PageTitle title = getTopTitle();
+ if (title == null) {
+ return;
+ }
+ if (saveShareButtonState) {
+ ShareUtil.shareText(getActivity(), title);
+ } else {
+ onAddPageToList(title);
+ }
+ }
+
+ public void onSelectPage(@NonNull PageTitle title) {
+ startActivity(PageActivity.newIntentForNewTab(getActivity(),
+ new HistoryEntry(title, HistoryEntry.SOURCE_RANDOM), title));
+ }
+
+ public void onAddPageToList(@NonNull PageTitle title) {
+ bottomSheetPresenter.show(getChildFragmentManager(),
+ AddToReadingListDialog.newInstance(title,
+ AddToReadingListDialog.InvokeSource.RANDOM_ACTIVITY,
+ (DialogInterface dialogInterface) ->
updateSaveShareButton(title)));
+ }
+
+ @SuppressWarnings("magicnumber")
+ private void updateBackButton(int pagerPosition) {
+ backButton.setClickable(pagerPosition != 0);
+ backButton.setAlpha(pagerPosition == 0 ? 0.5f : 1f);
+ }
+
+ private void updateSaveShareButton(@NonNull PageTitle title) {
+
ReadingList.DAO.anyListContainsTitleAsync(ReadingListDaoProxy.key(title),
+ new CallbackTask.DefaultCallback<ReadingListPage>() {
+ @Override public void success(@Nullable ReadingListPage
page) {
+ saveShareButtonState = page != null;
+ saveShareButton.setImageResource(saveShareButtonState
+ ? R.drawable.ic_share_white_24dp :
R.drawable.ic_bookmark_border_white_24dp);
+ }
+ });
+ }
+
+
+ @Nullable private PageTitle getTopTitle() {
+ FragmentManager fm = getFragmentManager();
+ for (Fragment f : fm.getFragments()) {
+ if (f instanceof RandomItemFragment
+ && ((RandomItemFragment) f).getPagerPosition() ==
randomPager.getCurrentItem()) {
+ return ((RandomItemFragment) f).getTitle();
+ }
+ }
+ return null;
+ }
+
+ private class RandomItemAdapter extends FragmentPagerAdapter {
+ RandomItemAdapter(AppCompatActivity activity) {
+ super(activity.getSupportFragmentManager());
+ }
+
+ @Override
+ public int getCount() {
+ return Integer.MAX_VALUE;
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ RandomItemFragment f = RandomItemFragment.newInstance();
+ f.setPagerPosition(position);
+ return f;
+ }
+ }
+
+ private class RandomPagerTransformer implements ViewPager.PageTransformer {
+ @SuppressWarnings("magicnumber")
+ @Override
+ public void transformPage(View view, float position) {
+ if (position < -1) { // [-Infinity,-1)
+ // This page is way off-screen to the left.
+ view.setRotation(0f);
+ view.setTranslationX(0);
+ } else if (position <= 0) { // [-1,0]
+ float factor = position * 45f;
+ view.setRotation(factor);
+ view.setTranslationX((view.getWidth() * position / 2));
+ view.setAlpha(1f);
+ } else if (position <= 1) { // (0,1]
+ // keep it in place (undo the default translation)
+ view.setTranslationX(-(view.getWidth() * position));
+ // but move it slightly down
+ view.setTranslationY(DimenUtil.roundedDpToPx(12f) * position);
+ // and make it translucent
+ view.setAlpha(1f - position * 0.5f);
+ view.setRotation(0f);
+ } else { // (1,+Infinity]
+ // This page is way off-screen to the right.
+ view.setRotation(0f);
+ view.setTranslationX(0);
+ }
+ }
+ }
+
+ private class ViewPagerListener implements ViewPager.OnPageChangeListener {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int
positionOffsetPixels) {
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ updateBackButton(position);
+ PageTitle title = getTopTitle();
+ if (title != null) {
+ updateSaveShareButton(title);
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ }
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/random/RandomItemFragment.java
b/app/src/main/java/org/wikipedia/random/RandomItemFragment.java
new file mode 100644
index 0000000..ed69650
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/random/RandomItemFragment.java
@@ -0,0 +1,116 @@
+package org.wikipedia.random;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.wikipedia.R;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.dataclient.restbase.page.RbPageSummary;
+import org.wikipedia.page.PageTitle;
+import org.wikipedia.views.FaceAndColorDetectImageView;
+import org.wikipedia.views.GoneIfEmptyTextView;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import butterknife.Unbinder;
+import retrofit2.Call;
+
+public class RandomItemFragment extends Fragment {
+ @BindView(R.id.random_item_container) ViewGroup containerView;
+ @BindView(R.id.random_item_progress) View progressBar;
+ @BindView(R.id.view_featured_article_card_image)
FaceAndColorDetectImageView imageView;
+ @BindView(R.id.view_featured_article_card_article_title) TextView
articleTitleView;
+ @BindView(R.id.view_featured_article_card_article_subtitle)
GoneIfEmptyTextView articleSubtitleView;
+ @BindView(R.id.view_featured_article_card_extract) TextView extractView;
+ private Unbinder unbinder;
+
+ @Nullable private RbPageSummary summary;
+ private int pagerPosition = -1;
+
+ @NonNull
+ public static RandomItemFragment newInstance() {
+ return new RandomItemFragment();
+ }
+
+ public void setPagerPosition(int position) {
+ pagerPosition = position;
+ }
+
+ public int getPagerPosition() {
+ return pagerPosition;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ View view = inflater.inflate(R.layout.fragment_random_item, container,
false);
+ unbinder = ButterKnife.bind(this, view);
+ imageView.setLegacyVisibilityHandlingEnabled(true);
+ setContents(null);
+
+ new
RandomSummaryClient().request(WikipediaApp.getInstance().getWikiSite(), new
RandomSummaryClient.Callback() {
+ @Override
+ public void onSuccess(@NonNull Call<RbPageSummary> call, @NonNull
RbPageSummary pageSummary) {
+ if (!isAdded()) {
+ return;
+ }
+ setContents(pageSummary);
+ }
+
+ @Override
+ public void onError(@NonNull Call<RbPageSummary> call, @NonNull
Throwable t) {
+ // TODO: show error.
+ }
+ });
+ return view;
+ }
+
+ @Override
+ public void onDestroyView() {
+ unbinder.unbind();
+ unbinder = null;
+ super.onDestroyView();
+ }
+
+ @OnClick(R.id.view_featured_article_card_text_container) void onClick(View
v) {
+ if (getTitle() != null) {
+ parent().onSelectPage(getTitle());
+ }
+ }
+
+ public void setContents(@Nullable RbPageSummary pageSummary) {
+ containerView.setVisibility(pageSummary == null ? View.GONE :
View.VISIBLE);
+ progressBar.setVisibility(pageSummary == null ? View.VISIBLE :
View.GONE);
+ if (summary == pageSummary) {
+ return;
+ }
+ summary = pageSummary;
+ if (summary == null) {
+ return;
+ }
+ articleTitleView.setText(summary.getNormalizedTitle());
+ articleSubtitleView.setText(null); //summary.getDescription());
+ extractView.setText(summary.getExtract());
+ imageView.loadImage(TextUtils.isEmpty(summary.getThumbnailUrl()) ? null
+ : Uri.parse(summary.getThumbnailUrl()));
+ }
+
+ @Nullable public PageTitle getTitle() {
+ return summary == null ? null
+ : new PageTitle(summary.getTitle(),
WikipediaApp.getInstance().getWikiSite());
+ }
+
+ private RandomFragment parent() {
+ return (RandomFragment)
getActivity().getSupportFragmentManager().getFragments().get(0);
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
b/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
index a8b794f..3a3f267 100644
--- a/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
+++ b/app/src/main/java/org/wikipedia/random/RandomSummaryClient.java
@@ -9,7 +9,6 @@
import org.wikipedia.dataclient.restbase.page.RbPageSummary;
import org.wikipedia.dataclient.retrofit.RbCachedService;
import org.wikipedia.dataclient.retrofit.WikiCachedService;
-import org.wikipedia.page.PageTitle;
import org.wikipedia.util.log.L;
import retrofit2.Call;
@@ -24,11 +23,10 @@
= new RbCachedService<>(Service.class);
public Call<RbPageSummary> request(@NonNull WikiSite wiki, @NonNull
Callback cb) {
- return request(cachedService.service(wiki), wiki, cb);
+ return request(cachedService.service(wiki), cb);
}
@VisibleForTesting Call<RbPageSummary> request(@NonNull Service service,
- @NonNull final WikiSite
wiki,
@NonNull final Callback cb)
{
Call<RbPageSummary> call = service.get();
call.enqueue(new retrofit2.Callback<RbPageSummary>() {
@@ -39,9 +37,7 @@
cb.onError(call, new JsonParseException("Response missing
required field(s)"));
return;
}
- RbPageSummary item = response.body();
- PageTitle title = new PageTitle(null, item.getTitle(), wiki);
- cb.onSuccess(call, title);
+ cb.onSuccess(call, response.body());
}
@Override
@@ -60,7 +56,7 @@
}
public interface Callback {
- void onSuccess(@NonNull Call<RbPageSummary> call, @NonNull PageTitle
title);
+ void onSuccess(@NonNull Call<RbPageSummary> call, @NonNull
RbPageSummary pageSummary);
void onError(@NonNull Call<RbPageSummary> call, @NonNull Throwable t);
}
}
diff --git
a/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
b/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
index 4f169f3..aef367c 100644
--- a/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
+++ b/app/src/main/java/org/wikipedia/readinglist/AddToReadingListDialog.java
@@ -43,7 +43,8 @@
FEED(4),
NEWS_ACTIVITY(5),
READING_LIST_ACTIVITY(6),
- MOST_READ_ACTIVITY(7);
+ MOST_READ_ACTIVITY(7),
+ RANDOM_ACTIVITY(8);
private static final EnumCodeMap<InvokeSource> MAP = new
EnumCodeMap<>(InvokeSource.class);
diff --git a/app/src/main/java/org/wikipedia/util/FeedbackUtil.java
b/app/src/main/java/org/wikipedia/util/FeedbackUtil.java
index f7b0d4d..c2bdc38 100644
--- a/app/src/main/java/org/wikipedia/util/FeedbackUtil.java
+++ b/app/src/main/java/org/wikipedia/util/FeedbackUtil.java
@@ -20,6 +20,7 @@
import org.wikipedia.R;
import org.wikipedia.main.MainActivity;
import org.wikipedia.page.PageActivity;
+import org.wikipedia.random.RandomActivity;
import java.util.concurrent.TimeUnit;
@@ -129,6 +130,8 @@
return activity.findViewById(R.id.fragment_main_coordinator);
} else if (activity instanceof PageActivity) {
return activity.findViewById(R.id.page_contents_container);
+ } else if (activity instanceof RandomActivity) {
+ return activity.findViewById(R.id.random_coordinator_layout);
} else {
return activity.findViewById(android.R.id.content);
}
diff --git a/app/src/main/res/drawable/ic_replay_black_24dp.xml
b/app/src/main/res/drawable/ic_replay_black_24dp.xml
new file mode 100644
index 0000000..5d2fd07
--- /dev/null
+++ b/app/src/main/res/drawable/ic_replay_black_24dp.xml
@@ -0,0 +1,5 @@
+<vector android:autoMirrored="true" android:height="24dp"
+ android:viewportHeight="24.0" android:viewportWidth="24.0"
+ android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FF000000"
android:pathData="M12,5V1L7,6l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6 -6,-2.69
-6,-6H4c0,4.42 3.58,8 8,8s8,-3.58 8,-8 -3.58,-8 -8,-8z"/>
+</vector>
diff --git a/app/src/main/res/layout-land/fragment_random.xml
b/app/src/main/res/layout-land/fragment_random.xml
new file mode 100644
index 0000000..fef3443
--- /dev/null
+++ b/app/src/main/res/layout-land/fragment_random.xml
@@ -0,0 +1,72 @@
+<android.support.design.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/random_coordinator_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="?attr/colorAccent"
+ android:transitionName="@string/transition_random_activity"
+ android:orientation="vertical">
+
+ <android.support.v4.view.ViewPagerWithVelocity
+ android:id="@+id/random_item_pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="80dp"/>
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="end">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ android:layout_gravity="center_vertical"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <ImageView
+ android:id="@+id/random_back_button"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:padding="4dp"
+ android:focusable="true"
+ android:clickable="true"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_replay_black_24dp"
+ android:tint="@android:color/white"
+ android:contentDescription="@null"/>
+
+ <android.support.design.widget.FloatingActionButton
+ android:id="@+id/random_next_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="32dp"
+ android:layout_marginBottom="32dp"
+ android:contentDescription="@string/view_next_random_article"
+ app:backgroundTint="@android:color/white"
+ app:borderWidth="0dp"
+ app:elevation="4dp"
+ app:srcCompat="@drawable/ic_casino_accent50_24dp"
+ android:tint="?attr/main_toolbar_color"/>
+
+ <ImageView
+ android:id="@+id/random_save_button"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:padding="4dp"
+ android:focusable="true"
+ android:clickable="true"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_bookmark_border_white_24dp"
+ android:tint="@android:color/white"
+
android:contentDescription="@string/button_add_to_reading_list"/>
+
+ </LinearLayout>
+
+ </FrameLayout>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/fragment_page.xml
b/app/src/main/res/layout/fragment_page.xml
index 440f01d..0254f4c 100644
--- a/app/src/main/res/layout/fragment_page.xml
+++ b/app/src/main/res/layout/fragment_page.xml
@@ -61,22 +61,6 @@
app:tabSelectedTextColor="@color/base18"
app:tabIndicatorColor="@color/base18" />
- <android.support.design.widget.FloatingActionButton
- android:id="@+id/page_random_button"
- style="@style/FloatingActionButton"
- android:layout_marginBottom="64dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|end"
-
android:contentDescription="@string/view_next_random_article"
- app:backgroundTint="?attr/colorAccent"
- app:borderWidth="0dp"
- app:elevation="4dp"
- app:srcCompat="@drawable/ic_casino_accent50_24dp"
- android:tint="@android:color/white"
- android:visibility="gone"
- tools:visibility="visible"/>
-
</android.support.design.widget.CoordinatorLayout>
</org.wikipedia.views.SwipeRefreshLayoutWithScroll>
diff --git a/app/src/main/res/layout/fragment_random.xml
b/app/src/main/res/layout/fragment_random.xml
new file mode 100644
index 0000000..8141d27
--- /dev/null
+++ b/app/src/main/res/layout/fragment_random.xml
@@ -0,0 +1,72 @@
+<android.support.design.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/random_coordinator_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="?attr/colorAccent"
+ android:transitionName="@string/transition_random_activity"
+ android:orientation="vertical">
+
+ <android.support.v4.view.ViewPagerWithVelocity
+ android:id="@+id/random_item_pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginBottom="80dp"/>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ app:layout_behavior="org.wikipedia.random.BottomViewBehavior">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ android:layout_gravity="center_horizontal"
+ android:gravity="center_vertical">
+
+ <ImageView
+ android:id="@+id/random_back_button"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:padding="4dp"
+ android:focusable="true"
+ android:clickable="true"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_replay_black_24dp"
+ android:tint="@android:color/white"
+ android:contentDescription="@null"/>
+
+ <android.support.design.widget.FloatingActionButton
+ android:id="@+id/random_next_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="32dp"
+ android:layout_marginEnd="32dp"
+ android:contentDescription="@string/view_next_random_article"
+ app:backgroundTint="@android:color/white"
+ app:borderWidth="0dp"
+ app:elevation="4dp"
+ app:srcCompat="@drawable/ic_casino_accent50_24dp"
+ android:tint="?attr/main_toolbar_color"/>
+
+ <ImageView
+ android:id="@+id/random_save_button"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:padding="4dp"
+ android:focusable="true"
+ android:clickable="true"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ app:srcCompat="@drawable/ic_bookmark_border_white_24dp"
+ android:tint="@android:color/white"
+
android:contentDescription="@string/button_add_to_reading_list"/>
+
+ </LinearLayout>
+
+ </FrameLayout>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/fragment_random_item.xml
b/app/src/main/res/layout/fragment_random_item.xml
new file mode 100644
index 0000000..4c00db7
--- /dev/null
+++ b/app/src/main/res/layout/fragment_random_item.xml
@@ -0,0 +1,102 @@
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <android.support.v7.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_margin="8dp"
+ app:cardBackgroundColor="?attr/paper_color"
+ app:cardUseCompatPadding="true">
+
+ <ProgressBar
+ android:id="@+id/random_item_progress"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="64dp"
+ android:layout_marginBottom="64dp"
+ android:background="?attr/paper_color"
+ android:layout_gravity="center"/>
+
+ <LinearLayout
+ android:id="@+id/random_item_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <org.wikipedia.views.FaceAndColorDetectImageView
+ style="@style/SimpleDraweeViewPlaceholder"
+ android:id="@+id/view_featured_article_card_image"
+ android:layout_width="match_parent"
+ android:layout_height="192dp"
+ app:fadeDuration="0"
+ app:actualImageScaleType="focusCrop" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="?attr/material_theme_border_color"/>
+
+ <LinearLayout
+ android:id="@+id/view_featured_article_card_text_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:clickable="true"
+ android:background="?attr/selectableItemBackground">
+
+ <TextView
+ style="@style/RtlAwareTextView"
+ android:id="@+id/view_featured_article_card_article_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="12dp"
+ android:paddingBottom="4dp"
+ android:textSize="24sp"
+ android:fontFamily="serif"
+ android:textColor="?attr/primary_text_color"
+ android:lineSpacingMultiplier="0.9"
+ android:maxLines="3"
+ android:ellipsize="end"
+ tools:text="Lorem ipsum"/>
+
+ <org.wikipedia.views.GoneIfEmptyTextView
+ style="@style/RtlAwareTextView"
+
android:id="@+id/view_featured_article_card_article_subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="?attr/secondary_text_color"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp"
+ android:textSize="12sp"
+ android:maxLines="3"
+ android:ellipsize="end"
+ tools:text="Lorem ipsum"/>
+
+ <TextView
+ style="@style/RtlAwareTextView"
+ android:id="@+id/view_featured_article_card_extract"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingBottom="16dp"
+ android:maxLines="4"
+ android:ellipsize="end"
+ android:lineSpacingMultiplier="1.4"
+ android:textSize="14sp"
+ android:textColor="?attr/primary_text_color"
+ tools:text="Lorem ipsum"/>
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+ </android.support.v7.widget.CardView>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings_no_translate.xml
b/app/src/main/res/values/strings_no_translate.xml
index fe42dce..19db219 100644
--- a/app/src/main/res/values/strings_no_translate.xml
+++ b/app/src/main/res/values/strings_no_translate.xml
@@ -103,6 +103,7 @@
<!-- Transition names -->
<string name="transition_news_item">newsItemTransition</string>
+ <string name="transition_random_activity">randomActivityTransition</string>
<!-- Miscellaneous -->
<string name="text_size_percent">%d%%</string>
diff --git
a/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.java
b/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.java
index bf845ad..0438d92 100644
--- a/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.java
+++ b/app/src/test/java/org/wikipedia/random/RandomSummaryClientTest.java
@@ -1,14 +1,11 @@
package org.wikipedia.random;
-
import android.support.annotation.NonNull;
import com.google.gson.JsonParseException;
import org.junit.Test;
-import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.dataclient.restbase.page.RbPageSummary;
-import org.wikipedia.page.PageTitle;
import org.wikipedia.random.RandomSummaryClient.Callback;
import org.wikipedia.random.RandomSummaryClient.Service;
import org.wikipedia.test.MockWebServerTest;
@@ -59,12 +56,12 @@
}
@NonNull private Call<RbPageSummary> request(@NonNull Callback cb) {
- return client.request(service(Service.class),
WikiSite.forLanguageCode("test"), cb);
+ return client.request(service(Service.class), cb);
}
private void assertCallbackSuccess(@NonNull Call<RbPageSummary> call,
@NonNull Callback cb) {
- verify(cb).onSuccess(eq(call), any(PageTitle.class));
+ verify(cb).onSuccess(eq(call), any(RbPageSummary.class));
//noinspection unchecked
verify(cb, never()).onError(any(Call.class), any(Throwable.class));
}
@@ -73,7 +70,7 @@
@NonNull Callback cb,
@NonNull Class<? extends Throwable>
expectedThrowable) {
//noinspection unchecked
- verify(cb, never()).onSuccess(any(Call.class), any(PageTitle.class));
+ verify(cb, never()).onSuccess(any(Call.class),
any(RbPageSummary.class));
verify(cb).onError(eq(call), isA(expectedThrowable));
}
}
--
To view, visit https://gerrit.wikimedia.org/r/388126
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I51d1799ca5b7557c89d5fa92d2ea135b9c44187a
Gerrit-PatchSet: 7
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Cooltey <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Sharvaniharan <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits