/* ownCloud Android client application * Copyright (C) 2011 Bartek Przybylski * Copyright (C) 2012-2013 ownCloud Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ package com.owncloud.android.ui; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.widget.PopupWindow; /** * Represents a custom PopupWindows * * @author Lorensius. W. T * */ public class CustomPopup { protected final View mAnchor; protected final PopupWindow mWindow; private View root; private Drawable background = null; protected final WindowManager mWManager; public CustomPopup(View anchor) { mAnchor = anchor; mWindow = new PopupWindow(anchor.getContext()); mWindow.setTouchInterceptor(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { CustomPopup.this.dismiss(); return true; } return false; } }); mWManager = (WindowManager) anchor.getContext().getSystemService( Context.WINDOW_SERVICE); onCreate(); } public void onCreate() { } public void onShow() { } public void preShow() { if (root == null) { throw new IllegalStateException( "setContentView called with a view to display"); } onShow(); if (background == null) { mWindow.setBackgroundDrawable(new BitmapDrawable()); } else { mWindow.setBackgroundDrawable(background); } mWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); mWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); mWindow.setTouchable(true); mWindow.setFocusable(true); mWindow.setOutsideTouchable(true); mWindow.setContentView(root); } public void setBackgroundDrawable(Drawable background) { this.background = background; } public void setContentView(View root) { this.root = root; mWindow.setContentView(root); } public void setContentView(int layoutResId) { LayoutInflater inflater = (LayoutInflater) mAnchor.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); setContentView(inflater.inflate(layoutResId, null)); } public void showDropDown() { showDropDown(0, 0); } public void showDropDown(int x, int y) { preShow(); mWindow.setAnimationStyle(android.R.style.Animation_Dialog); mWindow.showAsDropDown(mAnchor, x, y); } public void showLikeQuickAction() { showLikeQuickAction(0, 0); } public void showLikeQuickAction(int x, int y) { preShow(); mWindow.setAnimationStyle(android.R.style.Animation_Dialog); int[] location = new int[2]; mAnchor.getLocationOnScreen(location); Rect anchorRect = new Rect(location[0], location[1], location[0] + mAnchor.getWidth(), location[1] + mAnchor.getHeight()); root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); int rootW = root.getWidth(), rootH = root.getHeight(); int screenW = mWManager.getDefaultDisplay().getWidth(); int xpos = ((screenW - rootW) / 2) + x; int ypos = anchorRect.top - rootH + y; if (rootH > anchorRect.top) { ypos = anchorRect.bottom + y; } mWindow.showAtLocation(mAnchor, Gravity.NO_GRAVITY, xpos, ypos); } public void dismiss() { mWindow.dismiss(); } }