| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.chrome.browser.vr; |
| |
| import android.content.Context; |
| import android.view.Gravity; |
| import android.view.View; |
| import android.view.ViewGroup.MarginLayoutParams; |
| import android.widget.FrameLayout; |
| import android.widget.PopupWindow; |
| |
| import org.chromium.ui.UiUtils; |
| |
| /** |
| * This class implements a VrPopupWindow which is similar to Android PopupWindow in VR. |
| */ |
| public class VrPopupWindow extends PopupWindow { |
| private FrameLayout mVrPopupContainer; |
| private VrDialogManager mVrDialogManager; |
| private Context mContext; |
| private boolean mIsShowing; |
| private PopupWindow.OnDismissListener mOnDismissListener; |
| private int mWidth; |
| private int mHeight; |
| |
| public VrPopupWindow(Context context, VrDialogManager vrDialogManager) { |
| super(context); |
| mContext = context; |
| mVrDialogManager = vrDialogManager; |
| mVrDialogManager.setDialogFloating(true); |
| } |
| |
| @Override |
| public void showAtLocation(View parent, int gravity, int x, int y) { |
| View dialogView = getContentView(); |
| if (dialogView == null) return; |
| FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( |
| MarginLayoutParams.WRAP_CONTENT, MarginLayoutParams.WRAP_CONTENT, Gravity.CENTER); |
| UiUtils.removeViewFromParent(dialogView); |
| mVrPopupContainer = new FrameLayout(mContext); |
| mVrPopupContainer.setLayoutParams(new FrameLayout.LayoutParams(mWidth, mHeight)); |
| mVrPopupContainer.setBackgroundDrawable(getBackground()); |
| mVrPopupContainer.addView(dialogView, params); |
| mVrDialogManager.setDialogView(mVrPopupContainer); |
| mVrDialogManager.initVrDialog(mWidth, mHeight); |
| mVrDialogManager.setDialogLocation(x, y); |
| mVrDialogManager.setVrDialogDismissHandler(new Runnable() { |
| @Override |
| public void run() { |
| dismiss(); |
| } |
| }); |
| |
| mIsShowing = true; |
| } |
| |
| @Override |
| public void showAsDropDown(View anchor, int xoff, int yoff) { |
| showAtLocation(anchor, Gravity.NO_GRAVITY, xoff, yoff); |
| } |
| |
| @Override |
| public boolean isShowing() { |
| return mIsShowing; |
| } |
| |
| @Override |
| public void setOnDismissListener(PopupWindow.OnDismissListener onDismissListener) { |
| mOnDismissListener = onDismissListener; |
| } |
| |
| @Override |
| public void dismiss() { |
| if (!isShowing()) return; |
| |
| mVrDialogManager.setDialogView(null); |
| mVrDialogManager.closeVrDialog(); |
| mVrPopupContainer = null; |
| mIsShowing = false; |
| if (mOnDismissListener != null) { |
| mOnDismissListener.onDismiss(); |
| } |
| } |
| |
| @Override |
| public void update(int x, int y, int width, int height) { |
| mWidth = width; |
| mHeight = height; |
| if (mVrPopupContainer != null) { |
| mVrPopupContainer.setLayoutParams(new FrameLayout.LayoutParams(width, height)); |
| } |
| mVrDialogManager.setDialogLocation(x, y); |
| mVrDialogManager.setDialogSize(width, height); |
| } |
| } |