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