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

Reply via email to