diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 1b25e6571065354a9a68d5fed5babda2010ac83f..3ea0c83f2db65abe56638fef8094027ae8f80ed2 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2137,6 +2137,14 @@ class ContextImpl extends Context { return (mFlags & Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE) != 0; } + @Override + public boolean canLoadUnsafeResources() { + if (getPackageName().equals(getOpPackageName())) { + return true; + } + return (mFlags & Context.CONTEXT_IGNORE_SECURITY) != 0; + } + @Override public Display getDisplay() { if (mDisplay == null) { diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 2303a38397895b4bc814efec8c9b444b66a986f3..0f94065c6985be7feb0b5b2c431ac7ef39ce1988 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4657,6 +4657,12 @@ public abstract class Context { @SystemApi public abstract boolean isCredentialProtectedStorage(); + /** + * Returns true if the context can load unsafe resources, e.g. fonts. + * @hide + */ + public abstract boolean canLoadUnsafeResources(); + /** * @hide */ diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 3b27905d2c119464d5152c992a6888ce31768054..df59f0eba0a57c62af1bc874b52ea77f23d79fe5 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -920,6 +920,12 @@ public class ContextWrapper extends Context { return mBase.isCredentialProtectedStorage(); } + /** {@hide} */ + @Override + public boolean canLoadUnsafeResources() { + return mBase.canLoadUnsafeResources(); + } + /** * @hide */ diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 6b328ea019979c26a3346e9d082ade14e9c3f000..9a924890fcd7e9ebeef88c03a5ddef73dbb50561 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -913,7 +913,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextAppearance_fontFamily: - if (!context.isRestricted()) { + if (!context.isRestricted() && context.canLoadUnsafeResources()) { try { fontTypeface = appearance.getFont(attr); } catch (UnsupportedOperationException @@ -1233,7 +1233,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextView_fontFamily: - if (!context.isRestricted()) { + if (!context.isRestricted() && context.canLoadUnsafeResources()) { try { fontTypeface = a.getFont(attr); } catch (UnsupportedOperationException | Resources.NotFoundException e) { @@ -3417,7 +3417,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Typeface fontTypeface = null; String fontFamily = null; - if (!context.isRestricted()) { + if (!context.isRestricted() && context.canLoadUnsafeResources()) { try { fontTypeface = ta.getFont(R.styleable.TextAppearance_fontFamily); } catch (UnsupportedOperationException | Resources.NotFoundException e) { diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index bfc2d728ad5c4e5eb64662206f9175b3a17a83c2..24e7bff0979492a316366cc15e4eb86d9a635d29 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -808,6 +808,12 @@ public class MockContext extends Context { throw new UnsupportedOperationException(); } + /** {@hide} */ + @Override + public boolean canLoadUnsafeResources() { + throw new UnsupportedOperationException(); + } + /** {@hide} */ @Override public IBinder getActivityToken() { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 8bd924ea9cfb0d92632e962e2ace06ca1834b424..1fc5d725631092315c3d2b7d4ecaa4cc9e0449d7 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -2008,6 +2008,11 @@ public class BridgeContext extends Context { return false; } + @Override + public boolean canLoadUnsafeResources() { + return false; + } + /** * The cached value depends on *