• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.text.style;
18 
19 import static com.android.text.flags.Flags.FLAG_NO_BREAK_NO_HYPHENATION_SPAN;
20 
21 import android.annotation.FlaggedApi;
22 import android.annotation.NonNull;
23 import android.graphics.text.LineBreakConfig;
24 import android.os.Parcel;
25 import android.text.ParcelableSpan;
26 import android.text.TextUtils;
27 
28 import java.util.Objects;
29 
30 /**
31  * LineBreakSpan for changing line break style of the specific region of the text.
32  */
33 @FlaggedApi(FLAG_NO_BREAK_NO_HYPHENATION_SPAN)
34 public final class LineBreakConfigSpan implements ParcelableSpan {
35     private final LineBreakConfig mLineBreakConfig;
36 
37     /**
38      * Construct a new {@link LineBreakConfigSpan}
39      * @param lineBreakConfig a line break config
40      */
41     @FlaggedApi(FLAG_NO_BREAK_NO_HYPHENATION_SPAN)
LineBreakConfigSpan(@onNull LineBreakConfig lineBreakConfig)42     public LineBreakConfigSpan(@NonNull LineBreakConfig lineBreakConfig) {
43         mLineBreakConfig = lineBreakConfig;
44     }
45 
46     /**
47      * Gets an associated line break config.
48      * @return associated line break config.
49      */
50     @FlaggedApi(FLAG_NO_BREAK_NO_HYPHENATION_SPAN)
getLineBreakConfig()51     public @NonNull LineBreakConfig getLineBreakConfig() {
52         return mLineBreakConfig;
53     }
54 
55     /**
56      * A specialized {@link LineBreakConfigSpan} that used for preventing line break.
57      *
58      * This is useful when you want to preserve some words in the same line.
59      * Note that even if this style is specified, the grapheme based line break is still performed
60      * for preventing clipping text.
61      *
62      * @see LineBreakConfigSpan
63      */
64     @FlaggedApi(FLAG_NO_BREAK_NO_HYPHENATION_SPAN)
createNoBreakSpan()65     public static @NonNull LineBreakConfigSpan createNoBreakSpan() {
66         return new LineBreakConfigSpan(sNoBreakConfig);
67     }
68 
69     /**
70      * A specialized {@link LineBreakConfigSpan} that used for preventing hyphenation.
71      */
72     @FlaggedApi(FLAG_NO_BREAK_NO_HYPHENATION_SPAN)
createNoHyphenationSpan()73     public static @NonNull LineBreakConfigSpan createNoHyphenationSpan() {
74         return new LineBreakConfigSpan(sNoHyphenationConfig);
75     }
76 
77     @Override
equals(Object o)78     public boolean equals(Object o) {
79         if (this == o) return true;
80         if (!(o instanceof LineBreakConfigSpan)) return false;
81         LineBreakConfigSpan that = (LineBreakConfigSpan) o;
82         return Objects.equals(mLineBreakConfig, that.mLineBreakConfig);
83     }
84 
85     @Override
hashCode()86     public int hashCode() {
87         return Objects.hash(mLineBreakConfig);
88     }
89 
90     @Override
toString()91     public String toString() {
92         return "LineBreakConfigSpan{mLineBreakConfig=" + mLineBreakConfig + '}';
93     }
94 
95     private static final LineBreakConfig sNoHyphenationConfig = new LineBreakConfig.Builder()
96             .setHyphenation(LineBreakConfig.HYPHENATION_DISABLED)
97             .build();
98 
99     private static final LineBreakConfig sNoBreakConfig = new LineBreakConfig.Builder()
100             .setLineBreakStyle(LineBreakConfig.LINE_BREAK_STYLE_NO_BREAK)
101             .build();
102 
103     @Override
describeContents()104     public int describeContents() {
105         return 0;
106     }
107 
108     @Override
writeToParcel(@onNull Parcel dest, int flags)109     public void writeToParcel(@NonNull Parcel dest, int flags) {
110         writeToParcelInternal(dest, flags);
111     }
112 
113     @Override
getSpanTypeId()114     public int getSpanTypeId() {
115         return getSpanTypeIdInternal();
116     }
117 
118     /** @hide */
119     @Override
getSpanTypeIdInternal()120     public int getSpanTypeIdInternal() {
121         return TextUtils.LINE_BREAK_CONFIG_SPAN;
122     }
123 
124     /** @hide */
125     @Override
writeToParcelInternal(@onNull Parcel dest, int flags)126     public void writeToParcelInternal(@NonNull Parcel dest, int flags) {
127         dest.writeParcelable(mLineBreakConfig, flags);
128     }
129 
130     @NonNull
131     public static final Creator<LineBreakConfigSpan> CREATOR = new Creator<>() {
132 
133         @Override
134         public LineBreakConfigSpan createFromParcel(Parcel source) {
135             LineBreakConfig lbc = source.readParcelable(
136                     LineBreakConfig.class.getClassLoader(), LineBreakConfig.class);
137             return new LineBreakConfigSpan(lbc);
138         }
139 
140         @Override
141         public LineBreakConfigSpan[] newArray(int size) {
142             return new LineBreakConfigSpan[size];
143         }
144     };
145 }
146