Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 96e93959 authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Always suppress font error during resource loading

I suppressed the font error during resource loading only if the
targetSdkVersion is API 28 or before, but it turned out that this
makes developers hard to use font resources since:
- We don't give a list of supported font files and OEM may extend/shrink
  the font support.
- There is no way to resolve this error during layout inflation.

So, now always supress the IllegalArgumentException during building
Typeface in resource loading.

Bug: 127714175
Test: atest CtsTextTestCases
Test: atest CtsGraphicsTestCases
Test: atest FontsContractTest
Test: atest CtsWidgetTestCases
Change-Id: I08b9f27aaf25ff491fa36d0a4befb3c6e64abfcf
parent 36ad7638
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import android.graphics.fonts.FontFamily;
import android.graphics.fonts.FontStyle;
import android.graphics.fonts.FontVariationAxis;
import android.net.Uri;
import android.os.Build.VERSION_CODES;
import android.os.CancellationSignal;
import android.os.Handler;
import android.os.HandlerThread;
@@ -642,26 +641,36 @@ public class FontsContract {
                continue;
            }
            try {
                final Font font = new Font.Builder(buffer)
                Font font = null;
                try {
                    font = new Font.Builder(buffer)
                        .setWeight(fontInfo.getWeight())
                        .setSlant(fontInfo.isItalic()
                                ? FontStyle.FONT_SLANT_ITALIC : FontStyle.FONT_SLANT_UPRIGHT)
                        .setTtcIndex(fontInfo.getTtcIndex())
                        .setFontVariationSettings(fontInfo.getAxes())
                        .build();
                } catch (IllegalArgumentException e) {
                    // The exception happens if the unsupported font is passed. We suppress this
                    // exception and just ignore this font here since there is no way of
                    // resolving this issue by users during inflating layout.
                    Log.w(TAG, "Ignoring font file since failed to create font object."
                            + " The font file is not supported on this platform.");
                    continue;
                }
                if (familyBuilder == null) {
                    familyBuilder = new FontFamily.Builder(font);
                } else {
                    try {
                        familyBuilder.addFont(font);
                    } catch (IllegalArgumentException e) {
                        if (context.getApplicationInfo().targetSdkVersion <= VERSION_CODES.P) {
                            // Surpress the IllegalArgumentException for keeping the backward
                            // compatibility.
                        // The exception happens if the same style font is added to the family.
                        // We suppress this exception and just ignore this font here since there is
                        // no way of resolving this issue by users during inflating layout.
                        Log.w(TAG,
                                "Ignoring font file since the same style font is already added.");
                        continue;
                    }
                        throw e;
                    }
                }
            } catch (IOException e) {
                continue;
+20 −10
Original line number Diff line number Diff line
@@ -33,12 +33,12 @@ import android.graphics.fonts.FontStyle;
import android.graphics.fonts.FontVariationAxis;
import android.graphics.fonts.SystemFonts;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.os.ParcelFileDescriptor;
import android.provider.FontRequest;
import android.provider.FontsContract;
import android.text.FontConfig;
import android.util.Base64;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.LruCache;
import android.util.SparseArray;
@@ -48,7 +48,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;

import dalvik.annotation.optimization.CriticalNative;
import dalvik.system.VMRuntime;

import libcore.util.NativeAllocationRegistry;

@@ -262,19 +261,30 @@ public class Typeface {
                            ?  FontStyle.FONT_SLANT_ITALIC : FontStyle.FONT_SLANT_UPRIGHT);
                }

                Font font = null;
                try {
                    font = fontBuilder.build();
                } catch (IllegalArgumentException e) {
                    // The exception happens if the unsupported font is passed. We suppress this
                    // exception and just ignore this font here since there is no way of
                    // resolving this issue by users during inflating layout.
                    Log.w(TAG, "Ignoring font file since failed to create font object."
                            + " The font file is not supported on this platform.");
                    continue;
                }
                if (familyBuilder == null) {
                    familyBuilder = new FontFamily.Builder(fontBuilder.build());
                    familyBuilder = new FontFamily.Builder(font);
                } else {
                    try {
                        familyBuilder.addFont(fontBuilder.build());
                        familyBuilder.addFont(font);
                    } catch (IllegalArgumentException e) {
                        if (VMRuntime.getRuntime().getTargetSdkVersion() <= VERSION_CODES.P) {
                            // Surpress the IllegalArgumentException for keeping the backward
                            // compatibility.
                        // The exception happens if the same style is added to the family.
                        // We suppress this exception and just ignore this font here since there is
                        // no way of resolving this issue by users during inflating layout.
                        Log.w(TAG,
                                "Ignoring font file since the same style font is already added.");
                        continue;
                    }
                        throw e;
                    }
                }
            }
            if (familyBuilder == null) {
+4 −0
Original line number Diff line number Diff line
@@ -354,6 +354,10 @@ public final class Font {

        /**
         * Creates the font based on the configured values.
         *
         * If the font is not supported by the platform, this function will fail with
         * {@link IllegalArgumentException}.
         *
         * @return the Font object
         */
        public @Nullable Font build() throws IOException {