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

Commit 4893d528 authored by Seigo Nonaka's avatar Seigo Nonaka Committed by Automerger Merge Worker
Browse files

Merge "Do not hold unnecessary map reference" into sc-dev am: b755757c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13432327

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I8d7dd2e55a5648c8eb7c058e31f03b4835a0ca2a
parents 6d19cb02 b755757c
Loading
Loading
Loading
Loading
+36 −61
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ public final class FontManagerService extends IFontManager.Stub {

    @Override
    public FontConfig getFontConfig() throws RemoteException {
        return getCurrentFontSettings().getSystemFontConfig();
        return getSystemFontConfig();
    }

    /* package */ static class SystemFontException extends AndroidException {
@@ -103,7 +103,7 @@ public final class FontManagerService extends IFontManager.Stub {
                            if (!Typeface.ENABLE_LAZY_TYPEFACE_INITIALIZATION) {
                                return null;
                            }
                            return mService.getCurrentFontSettings().getSerializedSystemFontMap();
                            return mService.getCurrentFontMap();
                        }
                    });
            publishBinderService(Context.FONT_SERVICE, mService);
@@ -162,7 +162,7 @@ public final class FontManagerService extends IFontManager.Stub {

    @GuardedBy("FontManagerService.this")
    @Nullable
    private SystemFontSettings mCurrentFontSettings = null;
    private SharedMemory mSerializedFontMap = null;

    private FontManagerService(Context context) {
        mContext = context;
@@ -188,12 +188,12 @@ public final class FontManagerService extends IFontManager.Stub {
        return mContext;
    }

    @NonNull /* package */ SystemFontSettings getCurrentFontSettings() {
    @NonNull /* package */ SharedMemory getCurrentFontMap() {
        synchronized (FontManagerService.this) {
            if (mCurrentFontSettings == null) {
                mCurrentFontSettings = SystemFontSettings.create(mUpdatableFontDir);
            if (mSerializedFontMap == null) {
                mSerializedFontMap = buildNewSerializedFontMap();
            }
            return mCurrentFontSettings;
            return mSerializedFontMap;
        }
    }

@@ -207,7 +207,7 @@ public final class FontManagerService extends IFontManager.Stub {
        synchronized (FontManagerService.this) {
            mUpdatableFontDir.installFontFile(fd, pkcs7Signature);
            // Create updated font map in the next getSerializedSystemFontMap() call.
            mCurrentFontSettings = null;
            mSerializedFontMap = null;
        }
    }

@@ -245,69 +245,44 @@ public final class FontManagerService extends IFontManager.Stub {
        new FontManagerShellCommand(this).exec(this, in, out, err, args, callback, result);
    }

    /* package */ static class SystemFontSettings {
        private final @NonNull SharedMemory mSerializedSystemFontMap;
        private final @NonNull FontConfig mSystemFontConfig;
        private final @NonNull Map<String, FontFamily[]> mSystemFallbackMap;
        private final @NonNull Map<String, Typeface> mSystemTypefaceMap;

        SystemFontSettings(
                @NonNull SharedMemory serializedSystemFontMap,
                @NonNull FontConfig systemFontConfig,
                @NonNull Map<String, FontFamily[]> systemFallbackMap,
                @NonNull Map<String, Typeface> systemTypefaceMap) {
            mSerializedSystemFontMap = serializedSystemFontMap;
            mSystemFontConfig = systemFontConfig;
            mSystemFallbackMap = systemFallbackMap;
            mSystemTypefaceMap = systemTypefaceMap;
        }

        public @NonNull SharedMemory getSerializedSystemFontMap() {
            return mSerializedSystemFontMap;
        }

    /**
     * Returns an active system font configuration.
     */
    public @NonNull FontConfig getSystemFontConfig() {
            return mSystemFontConfig;
        }

        public @NonNull Map<String, FontFamily[]> getSystemFallbackMap() {
            return mSystemFallbackMap;
        if (mUpdatableFontDir != null) {
            return mUpdatableFontDir.getSystemFontConfig();
        } else {
            return SystemFonts.getSystemPreinstalledFontConfig();
        }

        public @NonNull Map<String, Typeface> getSystemTypefaceMap() {
            return mSystemTypefaceMap;
    }

        public static @Nullable SystemFontSettings create(
                @Nullable UpdatableFontDir updatableFontDir) {
            if (updatableFontDir != null) {
                final FontConfig fontConfig = updatableFontDir.getSystemFontConfig();
                final Map<String, FontFamily[]> fallback =
                        SystemFonts.buildSystemFallback(fontConfig);
    /**
     * Make new serialized font map data.
     */
    public @Nullable SharedMemory buildNewSerializedFontMap() {
        try {
            final FontConfig fontConfig = getSystemFontConfig();
            final Map<String, FontFamily[]> fallback = SystemFonts.buildSystemFallback(fontConfig);
            final Map<String, Typeface> typefaceMap =
                    SystemFonts.buildSystemTypefaces(fontConfig, fallback);

                try {
                    final SharedMemory shm = Typeface.serializeFontMap(typefaceMap);
                    return new SystemFontSettings(shm, fontConfig, fallback, typefaceMap);
            return Typeface.serializeFontMap(typefaceMap);
        } catch (IOException | ErrnoException e) {
            Slog.w(TAG, "Failed to serialize updatable font map. "
                    + "Retrying with system image fonts.", e);
        }
            }

        try {
            final FontConfig fontConfig = SystemFonts.getSystemPreinstalledFontConfig();
            final Map<String, FontFamily[]> fallback = SystemFonts.buildSystemFallback(fontConfig);
            final Map<String, Typeface> typefaceMap =
                    SystemFonts.buildSystemTypefaces(fontConfig, fallback);
            try {
                final SharedMemory shm = Typeface.serializeFontMap(typefaceMap);
                return new SystemFontSettings(shm, fontConfig, fallback, typefaceMap);

            return Typeface.serializeFontMap(typefaceMap);
        } catch (IOException | ErrnoException e) {
            Slog.e(TAG, "Failed to serialize SystemServer system font map", e);
        }
        return null;
    }
    }

}
+8 −8
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.graphics.fonts.Font;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.FontManager;
import android.graphics.fonts.FontVariationAxis;
import android.graphics.fonts.SystemFonts;
import android.os.Binder;
import android.os.ParcelFileDescriptor;
import android.os.Process;
@@ -95,8 +96,8 @@ public class FontManagerShellCommand extends ShellCommand {
    }

    /* package */ void dumpAll(@NonNull IndentingPrintWriter w) {
        final FontManagerService.SystemFontSettings settings = mService.getCurrentFontSettings();
        dumpFontConfig(w, settings.getSystemFontConfig());
        FontConfig fontConfig = mService.getSystemFontConfig();
        dumpFontConfig(w, fontConfig);
    }

    private void dumpSingleFontConfig(
@@ -276,19 +277,19 @@ public class FontManagerShellCommand extends ShellCommand {

    private int dump(ShellCommand shell) {
        final Context ctx = mService.getContext();
        final FontManagerService.SystemFontSettings settings =
                mService.getCurrentFontSettings();

        if (!DumpUtils.checkDumpPermission(ctx, TAG, shell.getErrPrintWriter())) {
            return 1;
        }
        final IndentingPrintWriter writer =
                new IndentingPrintWriter(shell.getOutPrintWriter(), "  ");
        String nextArg = shell.getNextArg();
        FontConfig fontConfig = mService.getSystemFontConfig();
        if (nextArg == null) {
            dumpFontConfig(writer, settings.getSystemFontConfig());
            dumpFontConfig(writer, fontConfig);
        } else {
            final Map<String, FontFamily[]> fallbackMap =
                    settings.getSystemFallbackMap();
                    SystemFonts.buildSystemFallback(fontConfig);
            FontFamily[] families = fallbackMap.get(nextArg);
            if (families == null) {
                writer.println("Font Family \"" + nextArg + "\" not found");
@@ -364,10 +365,9 @@ public class FontManagerShellCommand extends ShellCommand {
    }

    private int status(ShellCommand shell) throws SystemFontException {
        final FontManagerService.SystemFontSettings settings = mService.getCurrentFontSettings();
        final IndentingPrintWriter writer =
                new IndentingPrintWriter(shell.getOutPrintWriter(), "  ");
        FontConfig config = settings.getSystemFontConfig();
        FontConfig config = mService.getSystemFontConfig();

        writer.println("Current Version: " + config.getConfigVersion());
        LocalDateTime dt = LocalDateTime.ofEpochSecond(config.getLastModifiedDate(), 0,