1 /* ownCloud Android client application
2 * Copyright (C) 2011 Bartek Przybylski
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package eu
.alefzero
.owncloud
.ui
;
20 import android
.content
.Context
;
21 import android
.graphics
.Rect
;
22 import android
.graphics
.drawable
.BitmapDrawable
;
23 import android
.graphics
.drawable
.Drawable
;
24 import android
.view
.Gravity
;
25 import android
.view
.LayoutInflater
;
26 import android
.view
.MotionEvent
;
27 import android
.view
.View
;
28 import android
.view
.WindowManager
;
29 import android
.view
.View
.OnTouchListener
;
30 import android
.view
.ViewGroup
.LayoutParams
;
31 import android
.widget
.PopupWindow
;
34 * Represents a custom PopupWindows
35 * @author Lorensius. W. T
38 public class CustomPopup
{
39 protected final View mAnchor
;
40 protected final PopupWindow mWindow
;
42 private Drawable background
= null
;
43 protected final WindowManager mWManager
;
45 public CustomPopup(View anchor
) {
47 mWindow
= new PopupWindow(anchor
.getContext());
49 mWindow
.setTouchInterceptor(new OnTouchListener() {
51 public boolean onTouch(View v
, MotionEvent event
) {
52 if (event
.getAction() == MotionEvent
.ACTION_OUTSIDE
) {
53 CustomPopup
.this.dismiss();
60 mWManager
= (WindowManager
) anchor
.getContext().getSystemService(Context
.WINDOW_SERVICE
);
65 public void onCreate() {}
66 public void onShow() {}
68 public void preShow() {
70 throw new IllegalStateException("setContentView called with a view to display");
75 if (background
== null
) {
76 mWindow
.setBackgroundDrawable(new BitmapDrawable());
78 mWindow
.setBackgroundDrawable(background
);
81 mWindow
.setWidth(WindowManager
.LayoutParams
.WRAP_CONTENT
);
82 mWindow
.setHeight(WindowManager
.LayoutParams
.WRAP_CONTENT
);
83 mWindow
.setTouchable(true
);
84 mWindow
.setFocusable(true
);
85 mWindow
.setOutsideTouchable(true
);
87 mWindow
.setContentView(root
);
90 public void setBackgroundDrawable(Drawable background
) {
91 this.background
= background
;
94 public void setContentView(View root
) {
96 mWindow
.setContentView(root
);
99 public void setContentView(int layoutResId
) {
100 LayoutInflater inflater
=
101 (LayoutInflater
) mAnchor
.getContext().getSystemService(Context
.LAYOUT_INFLATER_SERVICE
);
102 setContentView(inflater
.inflate(layoutResId
, null
));
105 public void showDropDown() {
109 public void showDropDown(int x
, int y
) {
111 mWindow
.setAnimationStyle(android
.R
.style
.Animation_Dialog
);
112 mWindow
.showAsDropDown(mAnchor
, x
, y
);
115 public void showLikeQuickAction() {
116 showLikeQuickAction(0, 0);
119 public void showLikeQuickAction(int x
, int y
) {
122 mWindow
.setAnimationStyle(android
.R
.style
.Animation_Dialog
);
123 int[] location
= new int[2];
124 mAnchor
.getLocationOnScreen(location
);
127 new Rect(location
[0], location
[1], location
[0] + mAnchor
.getWidth(), location
[1] + mAnchor
.getHeight());
129 root
.setLayoutParams(new LayoutParams(LayoutParams
.WRAP_CONTENT
, LayoutParams
.WRAP_CONTENT
));
130 root
.measure(LayoutParams
.WRAP_CONTENT
, LayoutParams
.WRAP_CONTENT
);
132 int rootW
= root
.getWidth(), rootH
= root
.getHeight();
133 int screenW
= mWManager
.getDefaultDisplay().getWidth();
135 int xpos
= ((screenW
-rootW
)/2) + x
;
136 int ypos
= anchorRect
.top
- rootH
+ y
;
138 if (rootH
> anchorRect
.top
) {
139 ypos
= anchorRect
.bottom
+ y
;
141 mWindow
.showAtLocation(mAnchor
, Gravity
.NO_GRAVITY
, xpos
, ypos
);
144 public void dismiss() {