Dbrant has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/277707

Change subject: Groundwork for bottom sheets, part 2.
......................................................................

Groundwork for bottom sheets, part 2.

- Expanded our ExclusiveBottomSheetHandler to be able to support regular
  Dialogs, not just DialogFragments (although Dialogs won't be saved in
  the activity's savedInstanceState, but that's alright).

- Made a simple descendant of BottomSheetDialog that automatically
  disables dimming of the background when it's shown, which we need for
  some of our bottom sheets.

- Transitioned the ReferenceDialog, PageInfoDialog, and ShareDialog to be
  BottomSheetDialogs, some without dimming.

- Goodbye, old "BottomDialog" class.

Change-Id: If5047635859d7a6b31634deb4b7c96ffe4801881
---
D app/src/main/java/org/wikipedia/page/BottomDialog.java
M app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetHandler.java
A app/src/main/java/org/wikipedia/page/NoDimBottomSheetDialog.java
M app/src/main/java/org/wikipedia/page/PageActivity.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
M app/src/main/java/org/wikipedia/page/PageInfoDialog.java
M app/src/main/java/org/wikipedia/page/ReferenceDialog.java
M app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
8 files changed, 108 insertions(+), 109 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/07/277707/1

diff --git a/app/src/main/java/org/wikipedia/page/BottomDialog.java 
b/app/src/main/java/org/wikipedia/page/BottomDialog.java
deleted file mode 100644
index ccd66e4..0000000
--- a/app/src/main/java/org/wikipedia/page/BottomDialog.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.wikipedia.page;
-
-import org.wikipedia.R;
-
-import android.content.Context;
-import android.support.annotation.LayoutRes;
-import android.support.v7.app.AppCompatDialog;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowManager;
-
-/**
- * A dialog that appears at the bottom of the page.
- *
- * It slides up when the dialog is opened, and down when the dialog is closed.
- * Uses the R.style.BottomDialog style, which specifies the animation.
- */
-public class BottomDialog extends AppCompatDialog {
-    private View dialogLayout;
-
-    public BottomDialog(Context context, @LayoutRes int dialogLayoutResId) {
-        super(context, R.style.BottomDialog);
-
-        LayoutInflater inflater = (LayoutInflater) 
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        dialogLayout = inflater.inflate(dialogLayoutResId, null);
-        setContentView(dialogLayout);
-
-        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
-        lp.copyFrom(getWindow().getAttributes());
-        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
-        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
-        lp.gravity = Gravity.BOTTOM;
-        getWindow().setAttributes(lp);
-    }
-
-    protected View getDialogLayout() {
-        return dialogLayout;
-    }
-}
diff --git 
a/app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetHandler.java 
b/app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetHandler.java
index bce3014..f79e9da 100644
--- a/app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetHandler.java
+++ b/app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetHandler.java
@@ -1,11 +1,14 @@
 package org.wikipedia.page;
 
+import android.app.Dialog;
+import android.content.DialogInterface;
 import android.support.v4.app.DialogFragment;
 import android.support.v4.app.FragmentActivity;
 
 public class ExclusiveBottomSheetHandler {
     private static final String BOTTOM_SHEET_FRAGMENT_TAG = 
"bottom_sheet_fragment";
     private FragmentActivity activity;
+    private Dialog currentDialog;
 
     public ExclusiveBottomSheetHandler(FragmentActivity activity) {
         this.activity = activity;
@@ -16,10 +19,26 @@
         dialog.show(activity.getSupportFragmentManager(), 
BOTTOM_SHEET_FRAGMENT_TAG);
     }
 
+    public void show(Dialog dialog) {
+        dismiss();
+        currentDialog = dialog;
+        currentDialog.setOnDismissListener(new 
DialogInterface.OnDismissListener() {
+            @Override
+            public void onDismiss(DialogInterface dialogInterface) {
+                currentDialog = null;
+            }
+        });
+        currentDialog.show();
+    }
+
     public void dismiss() {
         DialogFragment dialog = (DialogFragment) 
activity.getSupportFragmentManager().findFragmentByTag(BOTTOM_SHEET_FRAGMENT_TAG);
         if (dialog != null) {
             dialog.dismiss();
         }
+        if (currentDialog != null && currentDialog.isShowing()) {
+            currentDialog.dismiss();
+        }
+        currentDialog = null;
     }
 }
diff --git a/app/src/main/java/org/wikipedia/page/NoDimBottomSheetDialog.java 
b/app/src/main/java/org/wikipedia/page/NoDimBottomSheetDialog.java
new file mode 100644
index 0000000..257160f
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/page/NoDimBottomSheetDialog.java
@@ -0,0 +1,40 @@
+package org.wikipedia.page;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.design.widget.BottomSheetBehavior;
+import android.support.design.widget.BottomSheetDialog;
+import android.widget.FrameLayout;
+
+/**
+ * Descendant of BottomSheetDialog that prevents the background from being 
dimmed.
+ */
+public class NoDimBottomSheetDialog extends BottomSheetDialog {
+    public NoDimBottomSheetDialog(@NonNull Context context) {
+        super(context);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().setDimAmount(0f);
+    }
+
+    protected void startExpanded() {
+        /*
+        HACK: In order to have the dialog be expanded by default, we have to 
call setState()
+        only *after* the dialog is created and laid out.
+        https://code.google.com/p/android/issues/detail?id=202174
+        TODO: remove when this is improved in the library.
+        */
+        getWindow().getDecorView().post(new Runnable() {
+            @Override
+            public void run() {
+                FrameLayout bottomSheet = (FrameLayout) 
getWindow().getDecorView().findViewById(android.support.design.R.id.design_bottom_sheet);
+                BottomSheetBehavior behavior = 
BottomSheetBehavior.from(bottomSheet);
+                behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
+            }
+        });
+    }
+}
diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.java 
b/app/src/main/java/org/wikipedia/page/PageActivity.java
index 90012cc..d80275b 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -682,6 +682,10 @@
         bottomSheetHandler.show(new ThemeChooserDialog());
     }
 
+    public ExclusiveBottomSheetHandler getBottomSheetHandler() {
+        return bottomSheetHandler;
+    }
+
     // Note: back button first handled in {@link #onOptionsItemSelected()};
     @Override
     public void onBackPressed() {
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java 
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index c3dc0bc..d09240c 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -138,7 +138,6 @@
 
     private CommunicationBridge bridge;
     private LinkHandler linkHandler;
-    private ReferenceDialog referenceDialog;
     private EditHandler editHandler;
     private ActionMode findInPageActionMode;
     @NonNull private ShareHandler shareHandler;
@@ -246,7 +245,6 @@
     public void onDestroyView() {
         //uninitialize the bridge, so that no further JS events can have any 
effect.
         bridge.cleanup();
-        shareHandler.onDestroy();
         tabsProvider.setTabsProviderListener(null);
         searchBarHideHandler.setScrollView(null);
         webView.clearAllListeners();
@@ -273,9 +271,7 @@
         linkHandler = new LinkHandler(getActivity(), bridge) {
             @Override
             public void onPageLinkClicked(String anchor) {
-                if (referenceDialog != null && referenceDialog.isShowing()) {
-                    referenceDialog.dismiss();
-                }
+                getPageActivity().getBottomSheetHandler().dismiss();
                 JSONObject payload = new JSONObject();
                 try {
                     payload.put("anchor", anchor);
@@ -300,16 +296,10 @@
             @Override
             protected void onReferenceClicked(String refHtml) {
                 if (!isAdded()) {
-                    Log.d("PageFragment",
-                          "Detached from activity, so stopping reference 
click.");
+                    Log.d("PageFragment", "Detached from activity, so stopping 
reference click.");
                     return;
                 }
-
-                if (referenceDialog == null) {
-                    referenceDialog = new ReferenceDialog(getActivity(), 
linkHandler);
-                }
-                referenceDialog.updateReference(refHtml);
-                referenceDialog.show();
+                getPageActivity().getBottomSheetHandler().show(new 
ReferenceDialog(getActivity(), linkHandler, refHtml));
             }
         };
 
@@ -405,9 +395,7 @@
             visitInExternalBrowser(getActivity(), 
Uri.parse(title.getMobileUri()));
             return;
         }
-        if (referenceDialog != null && referenceDialog.isShowing()) {
-            referenceDialog.dismiss();
-        }
+        getPageActivity().getBottomSheetHandler().dismiss();
         if (!TextUtils.isEmpty(title.getNamespace()) || 
!app.isLinkPreviewEnabled()) {
             HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_INTERNAL_LINK);
             getPageActivity().loadPage(title, historyEntry);
@@ -929,22 +917,16 @@
     }
 
     private void showContentIssues() {
-        showPageInfoDialog().showIssues();
+        showPageInfoDialog(false);
     }
 
     private void showSimilarTitles() {
-        showPageInfoDialog().showDisambig();
+        showPageInfoDialog(true);
     }
 
-    private PageInfoDialog showPageInfoDialog() {
-        PageInfoDialog dialog = new PageInfoDialog((PageActivity) 
getActivity(), pageInfo, pageInfoDialogHeight());
-        dialog.show();
-        return dialog;
-    }
-
-    private int pageInfoDialogHeight() {
-        // could have scrolled up a bit but the page info links must still be 
visible else they couldn't have been clicked
-        return webView.getHeight() + webView.getScrollY() - 
articleHeaderView.getHeight();
+    private void showPageInfoDialog(boolean startAtDisambig) {
+        getPageActivity().getBottomSheetHandler()
+                .show(new PageInfoDialog((PageActivity) getActivity(), 
pageInfo, startAtDisambig));
     }
 
     private void openInNewTab(PageTitle title, HistoryEntry entry, int 
position) {
diff --git a/app/src/main/java/org/wikipedia/page/PageInfoDialog.java 
b/app/src/main/java/org/wikipedia/page/PageInfoDialog.java
index bf8f708..ea69ffc 100644
--- a/app/src/main/java/org/wikipedia/page/PageInfoDialog.java
+++ b/app/src/main/java/org/wikipedia/page/PageInfoDialog.java
@@ -5,10 +5,11 @@
 
 import android.graphics.Typeface;
 import android.support.annotation.NonNull;
+import android.support.design.widget.BottomSheetDialog;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Button;
 import android.widget.AdapterView;
-import android.widget.FrameLayout;
 import android.widget.ListView;
 import android.widget.ViewFlipper;
 
@@ -17,16 +18,17 @@
 /**
  * A dialog to host page issues and disambig information.
  */
-public class PageInfoDialog extends BottomDialog {
+public class PageInfoDialog extends BottomSheetDialog {
     private final ViewFlipper flipper;
     private final Button disambigHeading;
     private final Button issuesHeading;
     private final ListView disambigList;
 
-    public PageInfoDialog(final PageActivity activity, PageInfo pageInfo, int 
height) {
-        super(activity, R.layout.dialog_page_info);
+    public PageInfoDialog(final PageActivity activity, PageInfo pageInfo, 
boolean startAtDisambig) {
+        super(activity);
+        View parentView = 
LayoutInflater.from(activity).inflate(R.layout.dialog_page_info, null);
+        setContentView(parentView);
 
-        View parentView = getDialogLayout();
         flipper = (ViewFlipper) 
parentView.findViewById(R.id.page_info_flipper);
         disambigList = (ListView) parentView.findViewById(R.id.disambig_list);
         ListView issuesList = (ListView) 
parentView.findViewById(R.id.page_issues_list);
@@ -44,8 +46,6 @@
                 dismiss();
             }
         });
-
-        parentView.setLayoutParams(new 
FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, height));
 
         issuesList.setAdapter(new IssuesListAdapter(activity, 
pageInfo.getContentIssues()));
         disambigList.setAdapter(new DisambigListAdapter(activity, 
pageInfo.getSimilarTitles()));
@@ -84,9 +84,15 @@
             issuesHeading.setVisibility(View.GONE);
             separatorHeading.setVisibility(View.GONE);
         }
+
+        if (startAtDisambig) {
+            showDisambig();
+        } else {
+            showIssues();
+        }
     }
 
-    public void showDisambig() {
+    private void showDisambig() {
         if (flipper.getCurrentView() != flipper.getChildAt(0)) {
             flipper.setInAnimation(getContext(), R.anim.slide_in_left);
             flipper.setOutAnimation(getContext(), R.anim.slide_out_right);
@@ -99,7 +105,7 @@
         issuesHeading.setEnabled(true);
     }
 
-    public void showIssues() {
+    private void showIssues() {
         if (flipper.getCurrentView() != flipper.getChildAt(1)) {
             flipper.setInAnimation(getContext(), R.anim.slide_in_right);
             flipper.setOutAnimation(getContext(), R.anim.slide_out_left);
diff --git a/app/src/main/java/org/wikipedia/page/ReferenceDialog.java 
b/app/src/main/java/org/wikipedia/page/ReferenceDialog.java
index e9ad170..44d7c36 100644
--- a/app/src/main/java/org/wikipedia/page/ReferenceDialog.java
+++ b/app/src/main/java/org/wikipedia/page/ReferenceDialog.java
@@ -3,25 +3,21 @@
 import org.wikipedia.R;
 import android.content.Context;
 import android.text.Html;
-import android.text.Spanned;
+import android.view.LayoutInflater;
+import android.view.View;
 import android.widget.TextView;
 
 /**
  * A dialog that displays the currently clicked reference.
  */
-public class ReferenceDialog extends BottomDialog {
-    private final LinkHandler linkHandler;
-    private final TextView referenceText;
+public class ReferenceDialog extends NoDimBottomSheetDialog {
+    public ReferenceDialog(Context context, LinkHandler linkHandler, String 
html) {
+        super(context);
+        View rootView = 
LayoutInflater.from(context).inflate(R.layout.dialog_reference, null);
+        setContentView(rootView);
 
-    public ReferenceDialog(Context context, LinkHandler linkHandler) {
-        super(context, R.layout.dialog_reference);
-        this.linkHandler = linkHandler;
-        referenceText = (TextView) 
getDialogLayout().findViewById(R.id.reference_text);
-    }
-
-    void updateReference(String refHtml) {
-        Spanned html = Html.fromHtml(refHtml);
-        referenceText.setText(html);
+        TextView referenceText = (TextView) 
rootView.findViewById(R.id.reference_text);
+        referenceText.setText(Html.fromHtml(html));
         referenceText.setMovementMethod(new 
LinkMovementMethodExt(linkHandler));
     }
 }
diff --git a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java 
b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
index b04f371..9e32f42 100755
--- a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
+++ b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
@@ -1,6 +1,5 @@
 package org.wikipedia.page.snippet;
 
-import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -9,6 +8,7 @@
 import android.support.annotation.IntegerRes;
 import android.support.annotation.NonNull;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
@@ -20,11 +20,11 @@
 import org.wikipedia.page.ImageLicense;
 import org.wikipedia.page.ImageLicenseFetchTask;
 import org.wikipedia.bridge.CommunicationBridge;
+import org.wikipedia.page.NoDimBottomSheetDialog;
 import org.wikipedia.page.PageTitle;
 import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.analytics.ShareAFactFunnel;
-import org.wikipedia.page.BottomDialog;
 import org.wikipedia.page.Page;
 import org.wikipedia.page.PageActivity;
 import org.wikipedia.page.PageProperties;
@@ -62,7 +62,6 @@
     private final PageActivity activity;
     private final CommunicationBridge bridge;
     private CompatActionMode webViewActionMode;
-    private Dialog shareDialog;
     private ShareAFactFunnel funnel;
 
     private void createFunnel() {
@@ -118,13 +117,6 @@
         FeedbackUtil.showMessage(activity, R.string.text_copied);
     }
 
-    public void onDestroy() {
-        if (shareDialog != null) {
-            shareDialog.dismiss();
-            shareDialog = null;
-        }
-    }
-
     /** Call #setFunnel before #shareSnippet. */
     private void shareSnippet(CharSequence input) {
         final PageFragment curPageFragment = activity.getCurPageFragment();
@@ -152,11 +144,8 @@
                         leadImageLicense);
 
                 final Bitmap snippetBitmap = snippetImage.drawBitmap();
-                if (shareDialog != null) {
-                    shareDialog.dismiss();
-                }
-                shareDialog = new PreviewDialog(activity, snippetBitmap, 
title, selectedText, funnel);
-                shareDialog.show();
+
+                activity.getBottomSheetHandler().show(new 
PreviewDialog(activity, snippetBitmap, title, selectedText, funnel));
             }
 
             @Override
@@ -310,15 +299,17 @@
  * A dialog to be displayed before sharing with two action buttons:
  * "Share as image", "Share as text".
  */
-class PreviewDialog extends BottomDialog {
+class PreviewDialog extends NoDimBottomSheetDialog {
     private boolean completed = false;
 
     PreviewDialog(final PageActivity activity, final Bitmap resultBitmap, 
final PageTitle title,
                   final String selectedText, final ShareAFactFunnel funnel) {
-        super(activity, R.layout.dialog_share_preview);
-        ImageView previewImage = (ImageView) 
getDialogLayout().findViewById(R.id.preview_img);
+        super(activity);
+        View rootView = 
LayoutInflater.from(activity).inflate(R.layout.dialog_share_preview, null);
+        setContentView(rootView);
+        ImageView previewImage = (ImageView) 
rootView.findViewById(R.id.preview_img);
         previewImage.setImageBitmap(resultBitmap);
-        getDialogLayout().findViewById(R.id.share_as_image_button)
+        rootView.findViewById(R.id.share_as_image_button)
                 .setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
@@ -331,7 +322,7 @@
                         completed = true;
                     }
                 });
-        getDialogLayout().findViewById(R.id.share_as_text_button)
+        rootView.findViewById(R.id.share_as_text_button)
                 .setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
@@ -353,6 +344,7 @@
                 }
             }
         });
+        startExpanded();
     }
 
     private String constructShareText(String selectedText, String introText) {

-- 
To view, visit https://gerrit.wikimedia.org/r/277707
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If5047635859d7a6b31634deb4b7c96ffe4801881
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to