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