content: /*
   * Copyright (C) 2012 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.style;
  
  import android.annotation.NonNull;
  import android.annotation.Nullable;
  import android.graphics.Paint;
  import android.os.LocaleList;
  import android.os.Parcel;
  import android.text.ParcelableSpan;
  import android.text.TextPaint;
  import android.text.TextUtils;
  
  import com.android.internal.util.Preconditions;
  
  import java.util.Locale;
  
  /**
   * Changes the {@link Locale} of the text to which the span is attached.
   */
  public class LocaleSpan extends MetricAffectingSpan implements ParcelableSpan {
      @NonNull
      private final LocaleList mLocales;
  
      /**
       * Creates a {@link LocaleSpan} from a well-formed {@link Locale}.  Note that only
       * {@link Locale} objects that can be created by {@link Locale#forLanguageTag(String)} are
       * supported.
       *
       * <p><b>Caveat:</b> Do not specify any {@link Locale} object that cannot be created by
       * {@link Locale#forLanguageTag(String)}.  {@code new Locale(" a ", " b c", " d")} is an
       * example of such a malformed {@link Locale} object.</p>
       *
       * @param locale The {@link Locale} of the text to which the span is attached.
       *
       * @see #LocaleSpan(LocaleList)
       */
      public LocaleSpan(@Nullable Locale locale) {
          mLocales = locale == null ? LocaleList.getEmptyLocaleList() : new LocaleList(locale);
      }
  
      /**
       * Creates a {@link LocaleSpan} from {@link LocaleList}.
       *
       * @param locales The {@link LocaleList} of the text to which the span is attached.
       * @throws NullPointerException if {@code locales} is null
       */
      public LocaleSpan(@NonNull LocaleList locales) {
          Preconditions.checkNotNull(locales, "locales cannot be null");
          mLocales = locales;
      }
  
      public LocaleSpan(Parcel source) {
          mLocales = LocaleList.CREATOR.createFromParcel(source);
      }
  
      @Override
      public int getSpanTypeId() {
          return getSpanTypeIdInternal();
      }
  
      /** @hide */
      public int getSpanTypeIdInternal() {
          return TextUtils.LOCALE_SPAN;
      }
  
      @Override
      public int describeContents() {
          return 0;
      }
  
      @Override
      public void writeToParcel(Parcel dest, int flags) {
          writeToParcelInternal(dest, flags);
      }
  
      /** @hide */
      public void writeToParcelInternal(Parcel dest, int flags) {
          mLocales.writeToParcel(dest, flags);
      }
  
      /**
       * @return The {@link Locale} for this span.  If multiple locales are associated with this
       * span, only the first locale is returned.  {@code null} if no {@link Locale} is specified.
       *
       * @see LocaleList#get(int)
       * @see #getLocales()
       */
      @Nullable
      public Locale getLocale() {
          return mLocales.get(0);
      }
  
      /**
       * @return The entire list of locales that are associated with this span.
       */
      @NonNull
      public LocaleList getLocales() {
          return mLocales;
      }
  
      @Override
      public void updateDrawState(TextPaint ds) {
          apply(ds, mLocales);
      }
  
      @Override
      public void updateMeasureState(TextPaint paint) {
          apply(paint, mLocales);
      }
  
      private static void apply(@NonNull Paint paint, @NonNull LocaleList locales) {
          paint.setTextLocales(locales);
      }
  }
  