From 3843288297149fa3f4ce9030adf1dcedbbce0f0f Mon Sep 17 00:00:00 2001 From: George Mount Date: Thu, 7 Feb 2019 08:36:54 -0800 Subject: [PATCH] Remove access to private field mFactorySet. Fixes: 123769585 Test: compiled framework mFactorySet is being modified by app developers to reset the factory on an existing LayoutInflater. Instead, a developer should use LayoutInflater#cloneInContext() to create a new LayoutInflater and set the factory on it instead. This is often desired at the Activity level, so that any part of the application getting a LayoutInflater using the Activity as a Context will get the LayoutInflater with a custom factory. To do this, the Activity has to replace the returned LayoutInflater. Something like this should work: private LayoutInflater mLayoutInflater; @Override public Object getSystemService(String name) { if (Context.LAYOUT_INFLATER_SERVICE.equals(name)) { if (mLayoutInflater == null) { mLayoutInflater = ((LayoutInflater)super.getSystemService(name)).cloneInContext(this); mLayoutInflater.setFactory(new CustomLayoutFactory()); } return mLayoutInflater; } return super.getSystemService(name); } Change-Id: I155ea9538c5783b32301252fb3fb9baa1cc92036 --- core/java/android/view/LayoutInflater.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java index 6a290b7fe0457..8685046949ec8 100644 --- a/core/java/android/view/LayoutInflater.java +++ b/core/java/android/view/LayoutInflater.java @@ -93,7 +93,12 @@ public abstract class LayoutInflater { protected final Context mContext; // these are optional, set by the caller - @UnsupportedAppUsage + /** + * If any developer has desire to change this value, they should instead use + * {@link #cloneInContext(Context)} and set the new factory in thew newly-created + * LayoutInflater. + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) private boolean mFactorySet; @UnsupportedAppUsage private Factory mFactory;