diff options
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.java | 76 |
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()); + } +} |