summaryrefslogtreecommitdiffstats
path: root/mobile/android/base/java/org/mozilla/gecko/menu/MenuPopup.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/base/java/org/mozilla/gecko/menu/MenuPopup.java')
-rw-r--r--mobile/android/base/java/org/mozilla/gecko/menu/MenuPopup.java76
1 files changed, 76 insertions, 0 deletions
diff --git a/mobile/android/base/java/org/mozilla/gecko/menu/MenuPopup.java b/mobile/android/base/java/org/mozilla/gecko/menu/MenuPopup.java
new file mode 100644
index 000000000..227cc7630
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/menu/MenuPopup.java
@@ -0,0 +1,76 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.menu;
+
+import org.mozilla.gecko.AppConstants;
+import org.mozilla.gecko.R;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.support.v7.widget.CardView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.PopupWindow;
+
+/**
+ * A popup to show the inflated MenuPanel.
+ */
+public class MenuPopup extends PopupWindow {
+ private final CardView mPanel;
+
+ private final int mPopupWidth;
+
+ public MenuPopup(Context context) {
+ super(context);
+
+ setFocusable(true);
+
+ mPopupWidth = context.getResources().getDimensionPixelSize(R.dimen.menu_popup_width);
+
+ // Setting a null background makes the popup to not close on touching outside.
+ setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+
+ LayoutInflater inflater = LayoutInflater.from(context);
+ mPanel = (CardView) inflater.inflate(R.layout.menu_popup, null);
+ setContentView(mPanel);
+
+ setAnimationStyle(R.style.PopupAnimation);
+ }
+
+ /**
+ * Adds the panel with the menu to its content.
+ *
+ * @param view The panel view with the menu to be shown.
+ */
+ public void setPanelView(View view) {
+ view.setLayoutParams(new FrameLayout.LayoutParams(mPopupWidth,
+ FrameLayout.LayoutParams.WRAP_CONTENT));
+
+ mPanel.removeAllViews();
+ mPanel.addView(view);
+ }
+
+ /**
+ * A small little offset.
+ */
+ @Override
+ public void showAsDropDown(View anchor) {
+ // Set a height, so that the popup will not be displayed below the bottom of the screen.
+ // We use the exact height of the internal content, which is the technique described in
+ // http://stackoverflow.com/a/7698709
+ setHeight(mPanel.getHeight());
+
+ // Attempt to align the center of the popup with the center of the anchor. If the anchor is
+ // near the edge of the screen, the popup will just align with the edge of the screen.
+ final int xOffset = anchor.getWidth() / 2 - mPopupWidth / 2;
+ showAsDropDown(anchor, xOffset, -anchor.getHeight());
+ }
+}