1322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes/*
2322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * Copyright (C) 2015 The Android Open Source Project
3322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes *
4322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * you may not use this file except in compliance with the License.
6322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * You may obtain a copy of the License at
7322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes *
8322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes *
10322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * Unless required by applicable law or agreed to in writing, software
11322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * See the License for the specific language governing permissions and
14322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * limitations under the License
15322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes */
16322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
17322f8748f9d8de6f79345f660c859f163ad363b7Chris Banespackage android.support.v4.widget;
18322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
19322f8748f9d8de6f79345f660c859f163ad363b7Chris Banesimport android.widget.PopupWindow;
20322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
21322f8748f9d8de6f79345f660c859f163ad363b7Chris Banesimport java.lang.reflect.Method;
22322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
23322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes/**
24322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes * Implementation of PopupWindow compatibility that can call Gingerbread APIs.
25322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes */
26322f8748f9d8de6f79345f660c859f163ad363b7Chris Banesclass PopupWindowCompatGingerbread {
27322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
28322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    private static Method sSetWindowLayoutTypeMethod;
29322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    private static boolean sSetWindowLayoutTypeMethodAttempted;
30322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    private static Method sGetWindowLayoutTypeMethod;
31322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    private static boolean sGetWindowLayoutTypeMethodAttempted;
32322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
33322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    static void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
34322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        if (!sSetWindowLayoutTypeMethodAttempted) {
35322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            try {
36322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                sSetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
37322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                        "setWindowLayoutType", int.class);
38322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                sSetWindowLayoutTypeMethod.setAccessible(true);
39322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            } catch (Exception e) {
40322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                // Reflection method fetch failed. Oh well.
41322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            }
42322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            sSetWindowLayoutTypeMethodAttempted = true;
43322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        }
44322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
45322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        if (sSetWindowLayoutTypeMethod != null) {
46322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            try {
47322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                sSetWindowLayoutTypeMethod.invoke(popupWindow, layoutType);
48322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            } catch (Exception e) {
49322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                // Reflection call failed. Oh well.
50322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            }
51322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        }
52322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    }
53322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
54322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    static int getWindowLayoutType(PopupWindow popupWindow) {
55322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        if (!sGetWindowLayoutTypeMethodAttempted) {
56322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            try {
57322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                sGetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
58322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                        "getWindowLayoutType");
59322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                sGetWindowLayoutTypeMethod.setAccessible(true);
60322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            } catch (Exception e) {
61322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                // Reflection method fetch failed. Oh well.
62322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            }
63322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            sGetWindowLayoutTypeMethodAttempted = true;
64322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        }
65322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
66322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        if (sGetWindowLayoutTypeMethod != null) {
67322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            try {
68322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                return (Integer) sGetWindowLayoutTypeMethod.invoke(popupWindow);
69322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            } catch (Exception e) {
70322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes                // Reflection call failed. Oh well.
71322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes            }
72322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        }
73322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes        return 0;
74322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes    }
75322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes
76322f8748f9d8de6f79345f660c859f163ad363b7Chris Banes}
77