jenkins-bot has submitted this change and it was merged.
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: I444f42fa021b16b2b1112173d4934eb10b08f57d
---
D app/src/main/java/org/wikipedia/page/BottomDialog.java
M app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetPresenter.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
M app/src/main/res/layout/dialog_page_info.xml
9 files changed, 116 insertions(+), 111 deletions(-)
Approvals:
Niedzielski: Looks good to me, approved
jenkins-bot: Verified
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/ExclusiveBottomSheetPresenter.java
b/app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetPresenter.java
index 6188aba..cf83b12 100644
--- a/app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetPresenter.java
+++ b/app/src/main/java/org/wikipedia/page/ExclusiveBottomSheetPresenter.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 ExclusiveBottomSheetPresenter {
private static final String BOTTOM_SHEET_FRAGMENT_TAG =
"bottom_sheet_fragment";
private FragmentActivity activity;
+ private Dialog currentDialog;
public ExclusiveBottomSheetPresenter(FragmentActivity activity) {
this.activity = activity;
@@ -16,10 +19,27 @@
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.setOnDismissListener(null);
+ 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..f4f2390
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/page/NoDimBottomSheetDialog.java
@@ -0,0 +1,41 @@
+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: We'd like some of our bottom sheets to be fully expanded when
opened (as
+ opposed to expanded to the peek height). In order to do this, however,
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 89bfb99..fa01a89 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -53,6 +53,7 @@
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.design.widget.BottomSheetDialog;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
@@ -682,6 +683,14 @@
bottomSheetPresenter.show(new ThemeChooserDialog());
}
+ public void dismissBottomSheet() {
+ bottomSheetPresenter.dismiss();
+ }
+
+ public void showBottomSheet(BottomSheetDialog dialog) {
+ bottomSheetPresenter.show(dialog);
+ }
+
// 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 634915a..745c722 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -139,7 +139,6 @@
private CommunicationBridge bridge;
private LinkHandler linkHandler;
- private ReferenceDialog referenceDialog;
private EditHandler editHandler;
private ActionMode findInPageActionMode;
@NonNull private ShareHandler shareHandler;
@@ -247,7 +246,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();
@@ -274,9 +272,7 @@
linkHandler = new LinkHandler(getActivity(), bridge) {
@Override
public void onPageLinkClicked(String anchor) {
- if (referenceDialog != null && referenceDialog.isShowing()) {
- referenceDialog.dismiss();
- }
+ getPageActivity().dismissBottomSheet();
JSONObject payload = new JSONObject();
try {
payload.put("anchor", anchor);
@@ -301,16 +297,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().showBottomSheet(new
ReferenceDialog(getActivity(), linkHandler, refHtml));
}
};
@@ -406,9 +396,7 @@
visitInExternalBrowser(getActivity(),
Uri.parse(title.getMobileUri()));
return;
}
- if (referenceDialog != null && referenceDialog.isShowing()) {
- referenceDialog.dismiss();
- }
+ getPageActivity().dismissBottomSheet();
if (!TextUtils.isEmpty(title.getNamespace()) ||
!app.isLinkPreviewEnabled()) {
HistoryEntry historyEntry = new HistoryEntry(title,
HistoryEntry.SOURCE_INTERNAL_LINK);
getPageActivity().loadPage(title, historyEntry);
@@ -930,22 +918,15 @@
}
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().showBottomSheet(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..194cd1e 100644
--- a/app/src/main/java/org/wikipedia/page/PageInfoDialog.java
+++ b/app/src/main/java/org/wikipedia/page/PageInfoDialog.java
@@ -5,10 +5,10 @@
import android.graphics.Typeface;
import android.support.annotation.NonNull;
+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 +17,17 @@
/**
* A dialog to host page issues and disambig information.
*/
-public class PageInfoDialog extends BottomDialog {
+public class PageInfoDialog extends NoDimBottomSheetDialog {
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 +45,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 +83,16 @@
issuesHeading.setVisibility(View.GONE);
separatorHeading.setVisibility(View.GONE);
}
+
+ if (startAtDisambig) {
+ showDisambig();
+ } else {
+ showIssues();
+ }
}
- public void showDisambig() {
+ private void showDisambig() {
+ startExpanded();
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..a796e81 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.showBottomSheet(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) {
diff --git a/app/src/main/res/layout/dialog_page_info.xml
b/app/src/main/res/layout/dialog_page_info.xml
index 34549b6..a9cafd4 100644
--- a/app/src/main/res/layout/dialog_page_info.xml
+++ b/app/src/main/res/layout/dialog_page_info.xml
@@ -87,11 +87,11 @@
<ListView
android:id="@+id/disambig_list"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="match_parent" />
<ListView
android:id="@+id/page_issues_list"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="match_parent" />
</ViewFlipper>
--
To view, visit https://gerrit.wikimedia.org/r/277831
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I444f42fa021b16b2b1112173d4934eb10b08f57d
Gerrit-PatchSet: 6
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits