nextcloud-android/src/com/owncloud/android/ui/CustomPopup.java

156 lines
4.8 KiB
Java
Raw Normal View History

/* ownCloud Android client application
* Copyright (C) 2011 Bartek Przybylski
2013-02-07 21:45:10 +04:00
* 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 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
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();
}
}