blob: df694ff6af313aede320381f62b8b06cef54c8e7 [file] [log] [blame]
/*
* Copyright (C) 2017 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.text;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Font configuration descriptions for System fonts.
*/
public final class FontConfig implements Parcelable {
private final List<Family> mFamilies = new ArrayList<>();
private final List<Alias> mAliases = new ArrayList<>();
public FontConfig() {
}
public FontConfig(FontConfig config) {
for (int i = 0; i < config.mFamilies.size(); i++) {
mFamilies.add(new Family(config.mFamilies.get(i)));
}
mAliases.addAll(config.mAliases);
}
/**
* Returns the ordered list of families included in the system fonts.
*/
public List<Family> getFamilies() {
return mFamilies;
}
/**
* Returns the list of aliases defined for the font families in the system fonts.
*/
public List<Alias> getAliases() {
return mAliases;
}
/**
* @hide
*/
public FontConfig(Parcel in) {
readFromParcel(in);
}
@Override
public void writeToParcel(Parcel out, int flag) {
out.writeInt(mFamilies.size());
for (int i = 0; i < mFamilies.size(); i++) {
mFamilies.get(i).writeToParcel(out, flag);
}
out.writeInt(mAliases.size());
for (int i = 0; i < mAliases.size(); i++) {
mAliases.get(i).writeToParcel(out, flag);
}
}
/**
* @hide
*/
public void readFromParcel(Parcel in) {
int size = in.readInt();
for (int i = 0; i < size; i++) {
mFamilies.add(new Family(in));
}
size = in.readInt();
for (int i = 0; i < size; i++) {
mAliases.add(new Alias(in));
}
}
@Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<FontConfig> CREATOR = new Parcelable.Creator() {
public FontConfig createFromParcel(Parcel in) {
return new FontConfig(in);
}
public FontConfig[] newArray(int size) {
return new FontConfig[size];
}
};
/**
* Class that holds information about a Font axis.
*/
public static final class Axis implements Parcelable {
private final int mTag;
private final float mStyleValue;
public Axis(int tag, float styleValue) {
this.mTag = tag;
this.mStyleValue = styleValue;
}
/**
* Returns the variable font axis tag associated to this axis.
*/
public int getTag() {
return mTag;
}
/**
* Returns the style value associated to the given axis for this font.
*/
public float getStyleValue() {
return mStyleValue;
}
/**
* @hide
*/
public Axis(Parcel in) {
mTag = in.readInt();
mStyleValue = in.readFloat();
}
@Override
public void writeToParcel(Parcel out, int flag) {
out.writeInt(mTag);
out.writeFloat(mStyleValue);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Axis> CREATOR = new Creator<Axis>() {
@Override
public Axis createFromParcel(Parcel in) {
return new Axis(in);
}
@Override
public Axis[] newArray(int size) {
return new Axis[size];
}
};
}
/**
* Class that holds information about a Font.
*/
public static final class Font implements Parcelable {
private final String mFontName;
private final int mTtcIndex;
private final List<Axis> mAxes;
private final int mWeight;
private final boolean mIsItalic;
private ParcelFileDescriptor mFd;
public Font(String fontName, int ttcIndex, List<Axis> axes, int weight, boolean isItalic) {
mFontName = fontName;
mTtcIndex = ttcIndex;
mAxes = axes;
mWeight = weight;
mIsItalic = isItalic;
mFd = null;
}
public Font(Font origin) {
mFontName = origin.mFontName;
mTtcIndex = origin.mTtcIndex;
mAxes = new ArrayList<>(origin.mAxes);
mWeight = origin.mWeight;
mIsItalic = origin.mIsItalic;
if (origin.mFd != null) {
try {
mFd = origin.mFd.dup();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Returns the name associated by the system to this font.
*/
public String getFontName() {
return mFontName;
}
/**
* Returns the index to be used to access this font when accessing a TTC file.
*/
public int getTtcIndex() {
return mTtcIndex;
}
/**
* Returns the list of axes associated to this font.
*/
public List<Axis> getAxes() {
return mAxes;
}
/**
* Returns the weight value for this font.
*/
public int getWeight() {
return mWeight;
}
/**
* Returns whether this font is italic.
*/
public boolean isItalic() {
return mIsItalic;
}
/**
* Returns a file descriptor to access the specified font. This should be closed after use.
*/
public ParcelFileDescriptor getFd() {
return mFd;
}
/**
* @hide
*/
public void setFd(ParcelFileDescriptor fd) {
mFd = fd;
}
/**
* @hide
*/
public Font(Parcel in) {
mFontName = in.readString();
mTtcIndex = in.readInt();
final int numAxes = in.readInt();
mAxes = new ArrayList<>();
for (int i = 0; i < numAxes; i++) {
mAxes.add(new Axis(in));
}
mWeight = in.readInt();
mIsItalic = in.readInt() == 1;
if (in.readInt() == 1) { /* has FD */
mFd = ParcelFileDescriptor.CREATOR.createFromParcel(in);
} else {
mFd = null;
}
}
@Override
public void writeToParcel(Parcel out, int flag) {
out.writeString(mFontName);
out.writeInt(mTtcIndex);
out.writeInt(mAxes.size());
for (int i = 0; i < mAxes.size(); i++) {
mAxes.get(i).writeToParcel(out, flag);
}
out.writeInt(mWeight);
out.writeInt(mIsItalic ? 1 : 0);
out.writeInt(mFd == null ? 0 : 1);
if (mFd != null) {
mFd.writeToParcel(out, flag);
}
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Font> CREATOR = new Creator<Font>() {
@Override
public Font createFromParcel(Parcel in) {
return new Font(in);
}
@Override
public Font[] newArray(int size) {
return new Font[size];
}
};
}
/**
* Class that holds information about a Font alias.
*/
public static final class Alias implements Parcelable {
private final String mName;
private final String mToName;
private final int mWeight;
public Alias(String name, String toName, int weight) {
this.mName = name;
this.mToName = toName;
this.mWeight = weight;
}
/**
* Returns the new name for the alias.
*/
public String getName() {
return mName;
}
/**
* Returns the existing name to which this alias points to.
*/
public String getToName() {
return mToName;
}
/**
* Returns the weight associated with this alias.
*/
public int getWeight() {
return mWeight;
}
/**
* @hide
*/
public Alias(Parcel in) {
mName = in.readString();
mToName = in.readString();
mWeight = in.readInt();
}
@Override
public void writeToParcel(Parcel out, int flag) {
out.writeString(mName);
out.writeString(mToName);
out.writeInt(mWeight);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Alias> CREATOR = new Creator<Alias>() {
@Override
public Alias createFromParcel(Parcel in) {
return new Alias(in);
}
@Override
public Alias[] newArray(int size) {
return new Alias[size];
}
};
}
/**
* Class that holds information about a Font family.
*/
public static final class Family implements Parcelable {
private final String mName;
private final List<Font> mFonts;
private final String mLanguage;
private final String mVariant;
public Family(String name, List<Font> fonts, String language, String variant) {
this.mName = name;
this.mFonts = fonts;
this.mLanguage = language;
this.mVariant = variant;
}
public Family(Family origin) {
this.mName = origin.mName;
this.mLanguage = origin.mLanguage;
this.mVariant = origin.mVariant;
this.mFonts = new ArrayList<>();
for (int i = 0; i < origin.mFonts.size(); i++) {
mFonts.add(new Font(origin.mFonts.get(i)));
}
}
/**
* Returns the name given by the system to this font family.
*/
public String getName() {
return mName;
}
/**
* Returns the list of fonts included in this family.
*/
public List<Font> getFonts() {
return mFonts;
}
/**
* Returns the language for this family. May be null.
*/
public String getLanguage() {
return mLanguage;
}
/**
* Returns the font variant for this family, e.g. "elegant" or "compact". May be null.
*/
public String getVariant() {
return mVariant;
}
/**
* @hide
*/
public Family(Parcel in) {
mName = in.readString();
final int size = in.readInt();
mFonts = new ArrayList<>();
for (int i = 0; i < size; i++) {
mFonts.add(new Font(in));
}
mLanguage = in.readString();
mVariant = in.readString();
}
@Override
public void writeToParcel(Parcel out, int flag) {
out.writeString(mName);
out.writeInt(mFonts.size());
for (int i = 0; i < mFonts.size(); i++) {
mFonts.get(i).writeToParcel(out, flag);
}
out.writeString(mLanguage);
out.writeString(mVariant);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Family> CREATOR = new Creator<Family>() {
@Override
public Family createFromParcel(Parcel in) {
return new Family(in);
}
@Override
public Family[] newArray(int size) {
return new Family[size];
}
};
}
}