[go: nahoru, domu]

1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package android.support.v4.widget;
18
19import android.widget.PopupWindow;
20
21import java.lang.reflect.Method;
22
23/**
24 * Implementation of PopupWindow compatibility that can call Gingerbread APIs.
25 */
26class PopupWindowCompatGingerbread {
27
28    private static Method sSetWindowLayoutTypeMethod;
29    private static boolean sSetWindowLayoutTypeMethodAttempted;
30    private static Method sGetWindowLayoutTypeMethod;
31    private static boolean sGetWindowLayoutTypeMethodAttempted;
32
33    static void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
34        if (!sSetWindowLayoutTypeMethodAttempted) {
35            try {
36                sSetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
37                        "setWindowLayoutType", int.class);
38                sSetWindowLayoutTypeMethod.setAccessible(true);
39            } catch (Exception e) {
40                // Reflection method fetch failed. Oh well.
41            }
42            sSetWindowLayoutTypeMethodAttempted = true;
43        }
44
45        if (sSetWindowLayoutTypeMethod != null) {
46            try {
47                sSetWindowLayoutTypeMethod.invoke(popupWindow, layoutType);
48            } catch (Exception e) {
49                // Reflection call failed. Oh well.
50            }
51        }
52    }
53
54    static int getWindowLayoutType(PopupWindow popupWindow) {
55        if (!sGetWindowLayoutTypeMethodAttempted) {
56            try {
57                sGetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
58                        "getWindowLayoutType");
59                sGetWindowLayoutTypeMethod.setAccessible(true);
60            } catch (Exception e) {
61                // Reflection method fetch failed. Oh well.
62            }
63            sGetWindowLayoutTypeMethodAttempted = true;
64        }
65
66        if (sGetWindowLayoutTypeMethod != null) {
67            try {
68                return (Integer) sGetWindowLayoutTypeMethod.invoke(popupWindow);
69            } catch (Exception e) {
70                // Reflection call failed. Oh well.
71            }
72        }
73        return 0;
74    }
75
76}
77