From b8c19b1b33c1de2b17a51ccc9fc2893489f9f878 Mon Sep 17 00:00:00 2001 From: Yigit Boyar Date: Wed, 17 Sep 2014 19:23:21 -0700 Subject: [PATCH] Find activity from context in menu inflator for click events Bug: 17514128 Change-Id: I3028182a5bdb85eccd9db0faa13da9fc459af3c6 --- core/java/android/view/MenuInflater.java | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java index 71296fa61965e..5811c17dbdb39 100644 --- a/core/java/android/view/MenuInflater.java +++ b/core/java/android/view/MenuInflater.java @@ -23,6 +23,7 @@ import org.xmlpull.v1.XmlPullParserException; import android.app.Activity; import android.content.Context; +import android.content.ContextWrapper; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.util.AttributeSet; @@ -74,7 +75,6 @@ public class MenuInflater { */ public MenuInflater(Context context) { mContext = context; - mRealOwner = context; mActionViewConstructorArguments = new Object[] {context}; mActionProviderConstructorArguments = mActionViewConstructorArguments; } @@ -259,6 +259,23 @@ public class MenuInflater { } } } + + private Object getRealOwner() { + if (mRealOwner == null) { + mRealOwner = findRealOwner(mContext); + } + return mRealOwner; + } + + private Object findRealOwner(Object owner) { + if (owner instanceof Activity) { + return owner; + } + if (owner instanceof ContextWrapper) { + return findRealOwner(((ContextWrapper) owner).getBaseContext()); + } + return owner; + } /** * State for the current menu. @@ -439,7 +456,7 @@ public class MenuInflater { + "be used within a restricted context"); } item.setOnMenuItemClickListener( - new InflatedOnMenuItemClickListener(mRealOwner, itemListenerMethodName)); + new InflatedOnMenuItemClickListener(getRealOwner(), itemListenerMethodName)); } if (item instanceof MenuItemImpl) {