OSDN Git Service

Add fontFeatureSettings to TextView and attrs
authorBehdad Esfahbod <behdad@google.com>
Wed, 30 Jul 2014 23:46:53 +0000 (19:46 -0400)
committerRaph Levien <raph@google.com>
Fri, 1 Aug 2014 21:35:05 +0000 (21:35 +0000)
New API is hidden.

Bug: 15246510
Change-Id: I8cdbbd3a36fc280e07569dbb130f8c237062fff5

core/java/android/widget/TextView.java
core/jni/android/graphics/Paint.cpp
core/res/res/values/attrs.xml
graphics/java/android/graphics/Paint.java

index 52618cc..a0f7baf 100644 (file)
@@ -658,6 +658,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
         float dx = 0, dy = 0, r = 0;
         boolean elegant = false;
         float letterSpacing = 0;
+        String fontFeatureSettings = null;
 
         final Resources.Theme theme = context.getTheme();
 
@@ -742,6 +743,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                 case com.android.internal.R.styleable.TextAppearance_letterSpacing:
                     letterSpacing = appearance.getFloat(attr, 0);
                     break;
+
+                case com.android.internal.R.styleable.TextAppearance_fontFeatureSettings:
+                    fontFeatureSettings = appearance.getString(attr);
+                    break;
                 }
             }
 
@@ -1087,6 +1092,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
             case com.android.internal.R.styleable.TextView_letterSpacing:
                 letterSpacing = a.getFloat(attr, 0);
                 break;
+
+            case com.android.internal.R.styleable.TextView_fontFeatureSettings:
+                fontFeatureSettings = a.getString(attr);
+                break;
             }
         }
         a.recycle();
@@ -1269,6 +1278,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
         setRawTextSize(textSize);
         setElegantTextHeight(elegant);
         setLetterSpacing(letterSpacing);
+        setFontFeatureSettings(fontFeatureSettings);
 
         if (allCaps) {
             setTransformationMethod(new AllCapsTransformationMethod(getContext()));
@@ -2502,6 +2512,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                 com.android.internal.R.styleable.TextAppearance_letterSpacing, 0));
         }
 
+        if (appearance.hasValue(com.android.internal.R.styleable.TextAppearance_fontFeatureSettings)) {
+            setFontFeatureSettings(appearance.getString(
+                com.android.internal.R.styleable.TextAppearance_fontFeatureSettings));
+        }
+
         appearance.recycle();
     }
 
@@ -2686,6 +2701,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
      * This will normally be 0.
      *
      * @see #setLetterSpacing(float)
+     * @see Paint#setLetterSpacing
      * @hide
      */
     public float getLetterSpacing() {
@@ -2697,7 +2713,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
      * for slight expansion will be around 0.05.  Negative values tighten text.
      *
      * @see #getLetterSpacing()
-     * @see Paint#setFlags
+     * @see Paint#getLetterSpacing
      *
      * @attr ref android.R.styleable#TextView_letterSpacing
      * @hide
@@ -2715,6 +2731,41 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
         }
     }
 
+    /**
+     * @return the currently set font feature settings.  Default is null.
+     *
+     * @see #setFontFeatureSettings(String)
+     * @see Paint#setFontFeatureSettings
+     * @hide
+     */
+    public String getFontFeatureSettings() {
+        return mTextPaint.getFontFeatureSettings();
+    }
+
+    /**
+     * Sets font feature settings.  The format is the same as the CSS
+     * font-feature-settings attribute:
+     * http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings
+     *
+     * @see #getFontFeatureSettings()
+     * @see Paint#getFontFeatureSettings
+     *
+     * @attr ref android.R.styleable#TextView_fontFeatureSettings
+     * @hide
+     */
+    @android.view.RemotableViewMethod
+    public void setFontFeatureSettings(String fontFeatureSettings) {
+        if (fontFeatureSettings != mTextPaint.getFontFeatureSettings()) {
+            mTextPaint.setFontFeatureSettings(fontFeatureSettings);
+
+            if (mLayout != null) {
+                nullLayouts();
+                requestLayout();
+                invalidate();
+            }
+        }
+    }
+
 
     /**
      * Sets the text color for all the states (normal, selected,
index 235e4f2..f6ced09 100644 (file)
@@ -430,9 +430,9 @@ public:
 
     static void setFontFeatureSettings(JNIEnv* env, jobject clazz, jlong paintHandle, jstring settings) {
         Paint* paint = reinterpret_cast<Paint*>(paintHandle);
-        if (!settings)
+        if (!settings) {
             paint->setFontFeatureSettings(std::string());
-        else {
+        else {
             ScopedUtfChars settingsChars(env, settings);
             paint->setFontFeatureSettings(std::string(settingsChars.c_str(), settingsChars.size()));
         }
index a31f18f..2baa599 100644 (file)
         <attr name="elegantTextHeight" format="boolean" />
         <!-- Text letter-spacing. -->
         <attr name="letterSpacing" format="float" />
+        <!-- Font feature settings. -->
+        <attr name="fontFeatureSettings" format="string" />
     </declare-styleable>
     <declare-styleable name="TextClock">
         <!-- Specifies the formatting pattern used to show the time and/or date
         <attr name="elegantTextHeight" />
         <!-- Text letter-spacing. -->
         <attr name="letterSpacing" />
+        <!-- Font feature settings. -->
+        <attr name="fontFeatureSettings" />
     </declare-styleable>
     <declare-styleable name="TextViewAppearance">
         <!-- Base text color, typeface, size, and style. -->
index ec862f8..ca8d736 100644 (file)
@@ -1305,10 +1305,13 @@ public class Paint {
      * @hide
      */
     public void setFontFeatureSettings(String settings) {
-        if (settings != null && settings.equals(""))
+        if (settings != null && settings.equals("")) {
             settings = null;
+        }
         if ((settings == null && mFontFeatureSettings == null)
-                || (settings != null && settings.equals(mFontFeatureSettings))) return;
+                || (settings != null && settings.equals(mFontFeatureSettings))) {
+            return;
+        }
         mFontFeatureSettings = settings;
         native_setFontFeatureSettings(mNativePaint, settings);
     }