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

Commit 43a1e3d3 authored by Alan Viverette's avatar Alan Viverette
Browse files

Move caption style to its own class, add presets

BUG: 9926077
Change-Id: I14e809c5a95103e57d30f4273399e9914af52b56
parent aaabfe95
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -28351,18 +28351,22 @@ package android.view.accessibility {
  public class CaptioningPreferences {
    ctor public CaptioningPreferences();
    method public static final int getBackgroundColor(android.content.ContentResolver);
    method public static final int getEdgeColor(android.content.ContentResolver);
    method public static final int getEdgeType(android.content.ContentResolver);
    method public static final float getFontSize(android.content.ContentResolver);
    method public static final int getForegroundColor(android.content.ContentResolver);
    method public static final java.util.Locale getLocale(android.content.ContentResolver);
    method public static final android.graphics.Typeface getTypeface(android.content.ContentResolver);
    method public static final boolean isEnabled(android.content.ContentResolver);
    field public static final java.lang.String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
    field public static final int EDGE_TYPE_DROP_SHADOWED = 2; // 0x2
  }
  public static final class CaptioningPreferences.CaptionStyle {
    method public static android.view.accessibility.CaptioningPreferences.CaptionStyle defaultUserStyle(android.content.ContentResolver);
    method public android.graphics.Typeface getTypeface();
    field public static final int EDGE_TYPE_DROP_SHADOW = 2; // 0x2
    field public static final int EDGE_TYPE_NONE = 0; // 0x0
    field public static final int EDGE_TYPE_UNIFORM = 1; // 0x1
    field public static final int EDGE_TYPE_OUTLINE = 1; // 0x1
    field public final int backgroundColor;
    field public final int edgeColor;
    field public final int edgeType;
    field public final int foregroundColor;
  }
}
+18 −3
Original line number Diff line number Diff line
@@ -3538,6 +3538,21 @@ public final class Settings {
        public static final String ACCESSIBILITY_CAPTIONING_LOCALE =
                "accessibility_captioning_locale";

        /**
         * Integer property that specifies the preset style for captions, one
         * of:
         * <ul>
         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_WHITE_ON_BLACK}
         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_BLACK_ON_WHITE}
         * <li>{@link android.view.accessibility.CaptioningManager#PRESET_CUSTOM}
         * </ul>
         *
         * @see java.util.Locale#toString
         * @hide
         */
        public static final String ACCESSIBILITY_CAPTIONING_PRESET =
                "accessibility_captioning_preset";

        /**
         * Integer property that specifes the background color for captions as a
         * packed 32-bit color.
@@ -3561,9 +3576,9 @@ public final class Settings {
        /**
         * Integer property that specifes the edge type for captions, one of:
         * <ul>
         * <li>{@link android.view.accessibility.CaptioningPreferences#EDGE_TYPE_NONE}
         * <li>{@link android.view.accessibility.CaptioningPreferences#EDGE_TYPE_UNIFORM}
         * <li>{@link android.view.accessibility.CaptioningPreferences#EDGE_TYPE_DROP_SHADOWED}
         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_NONE}
         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_OUTLINE}
         * <li>{@link android.view.accessibility.CaptioningManager#EDGE_TYPE_DROP_SHADOWED}
         * </ul>
         *
         * @see #ACCESSIBILITY_CAPTIONING_EDGE_COLOR
+229 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.view.accessibility;

import android.content.ContentResolver;
import android.graphics.Color;
import android.graphics.Typeface;
import android.provider.Settings.Secure;
import android.text.TextUtils;

import java.util.Locale;

/**
 * Contains methods for accessing preferred video captioning state and
 * properties.
 */
public class CaptioningManager {
    /**
     * Activity Action: Show settings for video captioning.
     * <p>
     * In some cases, a matching Activity may not exist, so ensure you safeguard
     * against this.
     * <p>
     * Input: Nothing.
     * <p>
     * Output: Nothing.
     */
    public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";

    private static final int DEFAULT_PRESET = 0;
    private static final int DEFAULT_ENABLED = 0;
    private static final float DEFAULT_FONT_SIZE = 24;

    /**
     * @param cr Resolver to access the database with.
     * @return The user's preferred caption enabled state.
     */
    public static final boolean isEnabled(ContentResolver cr) {
        return Secure.getInt(cr, Secure.ACCESSIBILITY_CAPTIONING_ENABLED, DEFAULT_ENABLED) == 1;
    }

    /**
     * @param cr Resolver to access the database with.
     * @return The raw locale string for the user's preferred caption language.
     * @hide
     */
    public static final String getRawLocale(ContentResolver cr) {
        return Secure.getString(cr, Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
    }

    /**
     * @param cr Resolver to access the database with.
     * @return The locale for the user's preferred caption language, or null if
     *         not specified.
     */
    public static final Locale getLocale(ContentResolver cr) {
        final String rawLocale = getRawLocale(cr);
        if (!TextUtils.isEmpty(rawLocale)) {
            final String[] splitLocale = rawLocale.split("_");
            switch (splitLocale.length) {
                case 3:
                    return new Locale(splitLocale[0], splitLocale[1], splitLocale[2]);
                case 2:
                    return new Locale(splitLocale[0], splitLocale[1]);
                case 1:
                    return new Locale(splitLocale[0]);
            }
        }

        return null;
    }

    /**
     * @param cr Resolver to access the database with.
     * @return The user's preferred font size for video captions, or 0 if not
     *         specified.
     */
    public static final float getFontSize(ContentResolver cr) {
        return Secure.getFloat(cr, Secure.ACCESSIBILITY_CAPTIONING_FONT_SIZE, DEFAULT_FONT_SIZE);
    }

    public static final class CaptionStyle {
        private static final CaptionStyle WHITE_ON_BLACK;
        private static final CaptionStyle BLACK_ON_WHITE;
        private static final CaptionStyle YELLOW_ON_BLACK;
        private static final CaptionStyle YELLOW_ON_BLUE;
        private static final CaptionStyle DEFAULT_CUSTOM;

        /** @hide */
        public static final CaptionStyle[] PRESETS;

        /** @hide */
        public static final int PRESET_CUSTOM = -1;

        /** Edge type value specifying no character edges. */
        public static final int EDGE_TYPE_NONE = 0;

        /** Edge type value specifying uniformly outlined character edges. */
        public static final int EDGE_TYPE_OUTLINE = 1;

        /** Edge type value specifying drop-shadowed character edges. */
        public static final int EDGE_TYPE_DROP_SHADOW = 2;

        /** The preferred foreground color for video captions. */
        public final int foregroundColor;

        /** The preferred background color for video captions. */
        public final int backgroundColor;

        /**
         * The preferred edge type for video captions, one of:
         * <ul>
         * <li>{@link #EDGE_TYPE_NONE}
         * <li>{@link #EDGE_TYPE_OUTLINE}
         * <li>{@link #EDGE_TYPE_DROP_SHADOW}
         * </ul>
         */
        public final int edgeType;

        /**
         * The preferred edge color for video captions, if using an edge type
         * other than {@link #EDGE_TYPE_NONE}.
         */
        public final int edgeColor;

        /**
         * @hide
         */
        public final String mRawTypeface;

        private Typeface mParsedTypeface;

        private CaptionStyle(int foregroundColor, int backgroundColor, int edgeType, int edgeColor,
                String rawTypeface) {
            this.foregroundColor = foregroundColor;
            this.backgroundColor = backgroundColor;
            this.edgeType = edgeType;
            this.edgeColor = edgeColor;

            mRawTypeface = rawTypeface;
        }

        /**
         * @return The preferred {@link Typeface} for video captions, or null if
         *         not specified.
         */
        public Typeface getTypeface() {
            if (mParsedTypeface == null && !TextUtils.isEmpty(mRawTypeface)) {
                mParsedTypeface = Typeface.create(mRawTypeface, Typeface.NORMAL);
            }
            return mParsedTypeface;
        }

        /**
         * @hide
         */
        public static int getRawPreset(ContentResolver cr) {
            return Secure.getInt(cr, Secure.ACCESSIBILITY_CAPTIONING_PRESET, DEFAULT_PRESET);
        }

        /**
         * @param cr Resolver to access the database with.
         * @return The user's preferred caption style.
         */
        public static CaptionStyle defaultUserStyle(ContentResolver cr) {
            final int preset = getRawPreset(cr);
            if (preset == PRESET_CUSTOM) {
                return getCustomStyle(cr);
            }

            return PRESETS[preset];
        }

        /**
         * @hide
         */
        public static CaptionStyle getCustomStyle(ContentResolver cr) {
            final int foregroundColor = Secure.getInt(
                    cr, Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
                    DEFAULT_CUSTOM.foregroundColor);
            final int backgroundColor = Secure.getInt(cr,
                    Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
                    DEFAULT_CUSTOM.backgroundColor);
            final int edgeType = Secure.getInt(
                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, DEFAULT_CUSTOM.edgeType);
            final int edgeColor = Secure.getInt(
                    cr, Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR, DEFAULT_CUSTOM.edgeColor);

            String rawTypeface = Secure.getString(cr, Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE);
            if (rawTypeface == null) {
                rawTypeface = DEFAULT_CUSTOM.mRawTypeface;
            }

            return new CaptionStyle(
                    foregroundColor, backgroundColor, edgeType, edgeColor, rawTypeface);
        }

        static {
            WHITE_ON_BLACK = new CaptionStyle(
                    Color.WHITE, Color.BLACK, EDGE_TYPE_NONE, Color.BLACK, null);
            BLACK_ON_WHITE = new CaptionStyle(
                    Color.BLACK, Color.WHITE, EDGE_TYPE_NONE, Color.BLACK, null);
            YELLOW_ON_BLACK = new CaptionStyle(
                    Color.YELLOW, Color.BLACK, EDGE_TYPE_NONE, Color.BLACK, null);
            YELLOW_ON_BLUE = new CaptionStyle(
                    Color.YELLOW, Color.BLUE, EDGE_TYPE_NONE, Color.BLACK, null);

            PRESETS = new CaptionStyle[] {
                    WHITE_ON_BLACK, BLACK_ON_WHITE, YELLOW_ON_BLACK, YELLOW_ON_BLUE
            };

            DEFAULT_CUSTOM = WHITE_ON_BLACK;
        }
    }
}
+0 −246
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.view.accessibility;

import android.content.ContentResolver;
import android.graphics.Color;
import android.graphics.Typeface;
import android.provider.Settings;

import java.util.Locale;

/**
 * Contains methods for accessing preferred video captioning state and
 * properties.
 */
public class CaptioningPreferences {
    /**
     * Activity Action: Show settings for video captioning.
     * <p>
     * In some cases, a matching Activity may not exist, so ensure you safeguard
     * against this.
     * <p>
     * Input: Nothing.
     * <p>
     * Output: Nothing.
     */
    public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";

    /**
     * Value specifying no character edges.
     *
     * @see #getEdgeType
     */
    public static final int EDGE_TYPE_NONE = 0;

    /**
     * Value specifying uniform (outlined) character edges.
     *
     * @see #getEdgeType
     */
    public static final int EDGE_TYPE_UNIFORM = 1;

    /**
     * Value specifying drop-shadowed character edges.
     *
     * @see #getEdgeType
     */
    public static final int EDGE_TYPE_DROP_SHADOWED = 2;

    // Typeface values MUST be synced with arrays.xml
    private static final String TYPEFACE_DEFAULT = "DEFAULT";
    private static final String TYPEFACE_MONOSPACE = "MONOSPACE";
    private static final String TYPEFACE_SANS_SERIF = "SANS_SERIF";
    private static final String TYPEFACE_SERIF = "SERIF";

    private static final int DEFAULT_ENABLED = 0;
    private static final int DEFAULT_FOREGROUND_COLOR = Color.WHITE;
    private static final int DEFAULT_BACKGROUND_COLOR = Color.TRANSPARENT;
    private static final int DEFAULT_EDGE_TYPE = EDGE_TYPE_UNIFORM;
    private static final int DEFAULT_EDGE_COLOR = Color.BLACK;
    private static final Typeface DEFAULT_TYPEFACE = Typeface.DEFAULT;
    private static final int DEFAULT_FONT_SIZE = 24;
    private static final String DEFAULT_LOCALE = "";

    /**
     * Returns the preferred enabled state for video captions.
     *
     * @param cr Resolver to access the database with.
     * @return True if captions should be shown in supported video players.
     */
    public static final boolean isEnabled(ContentResolver cr) {
        return Settings.Secure.getInt(
                cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, DEFAULT_ENABLED) == 1;
    }

    /**
     * Returns the preferred foreground color for video captions.
     *
     * @param cr Resolver to access the database with.
     * @return The preferred foreground color for video captions.
     */
    public static final int getForegroundColor(ContentResolver cr) {
        return Settings.Secure.getInt(cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
                DEFAULT_FOREGROUND_COLOR);
    }

    /**
     * Returns the preferred background color for video captions.
     *
     * @param cr Resolver to access the database with.
     * @return The preferred background color for video captions.
     */
    public static final int getBackgroundColor(ContentResolver cr) {
        return Settings.Secure.getInt(cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
                DEFAULT_BACKGROUND_COLOR);
    }

    /**
     * Returns the preferred edge type for video captions, one of:
     * <ul>
     * <li>{@link #EDGE_TYPE_NONE}
     * <li>{@link #EDGE_TYPE_UNIFORM}
     * <li>{@link #EDGE_TYPE_DROP_SHADOWED}
     * </ul>
     *
     * @param cr Resolver to access the database with.
     * @return The preferred edge type for video captions.
     */
    public static final int getEdgeType(ContentResolver cr) {
        return Settings.Secure.getInt(
                cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, DEFAULT_EDGE_TYPE);
    }

    /**
     * Returns the preferred shadow color for video captions.
     *
     * @param cr Resolver to access the database with.
     * @return The preferred shadow color for video captions.
     */
    public static final int getEdgeColor(ContentResolver cr) {
        return Settings.Secure.getInt(
                cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR, DEFAULT_EDGE_COLOR);
    }

    /**
     * Returns the raw value representing the preferred typeface for video
     * captions.
     *
     * @param cr Resolver to access the database with.
     * @return The raw value representing the preferred typeface for video
     *         captions.
     * @hide
     */
    public static final String getRawTypeface(ContentResolver cr) {
        final String rawTypeface = Settings.Secure.getString(
                cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE);
        if (rawTypeface != null) {
            return rawTypeface;
        }

        return TYPEFACE_DEFAULT;
    }

    /**
     * Returns the preferred typeface for video captions.
     *
     * @param cr Resolver to access the database with.
     * @return The preferred typeface for video captions.
     */
    public static final Typeface getTypeface(ContentResolver cr) {
        final String rawTypeface = getRawTypeface(cr);
        if (TYPEFACE_DEFAULT.equals(rawTypeface)) {
            return Typeface.DEFAULT;
        } else if (TYPEFACE_MONOSPACE.equals(rawTypeface)) {
            return Typeface.MONOSPACE;
        } else if (TYPEFACE_SANS_SERIF.equals(rawTypeface)) {
            return Typeface.SANS_SERIF;
        } else if (TYPEFACE_SERIF.equals(rawTypeface)) {
            return Typeface.SERIF;
        }

        return DEFAULT_TYPEFACE;
    }

    /**
     * Returns the raw value representing the preferred font size for video
     * captions.
     *
     * @param cr Resolver to access the database with.
     * @return The raw value representing the preferred font size for video
     *         captions.
     * @hide
     */
    public static final int getRawFontSize(ContentResolver cr) {
        return Settings.Secure.getInt(
                cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SIZE, DEFAULT_FONT_SIZE);
    }

    /**
     * Returns the preferred font size for video captions.
     *
     * @param cr Resolver to access the database with.
     * @return The preferred font size for video captions.
     */
    public static final float getFontSize(ContentResolver cr) {
        return getRawFontSize(cr);
    }

    /**
     * Returns the raw value representing the preferred locale for video
     * captions.
     *
     * @param cr Resolver to access the database with.
     * @return The raw value representing the preferred locale for video
     *         captions.
     * @hide
     */
    public static final String getRawLocale(ContentResolver cr) {
        final String rawLocale = Settings.Secure.getString(
                cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_LOCALE);
        if (rawLocale != null) {
            return rawLocale;
        }

        return DEFAULT_LOCALE;
    }

    /**
     * Returns the preferred locale for video captions, or null to use the
     * device locale.
     *
     * @param cr Resolver to access the database with.
     * @return The preferred locale for video captions, or null to use the
     *         device locale.
     */
    public static final Locale getLocale(ContentResolver cr) {
        final String rawLocale = getRawLocale(cr);
        if (rawLocale.length() > 0) {
            final String[] splitLocale = rawLocale.split("_");
            switch (splitLocale.length) {
                case 3:
                    return new Locale(splitLocale[0], splitLocale[1], splitLocale[2]);
                case 2:
                    return new Locale(splitLocale[0], splitLocale[1]);
                case 1:
                    return new Locale(splitLocale[0]);
            }
        }

        return null;
    }
}