├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── ru
│ │ └── igla
│ │ └── widget
│ │ └── autosizetextview
│ │ └── ApplicationTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── ru
│ │ │ └── igla
│ │ │ └── widget
│ │ │ └── autosizetextview
│ │ │ └── FullscreenActivity.java
│ └── res
│ │ ├── layout
│ │ └── fullscreen.xml
│ │ ├── mipmap-hdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ └── ic_launcher.png
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── ru
│ └── igla
│ └── widget
│ └── autosizetextview
│ └── ExampleUnitTest.java
├── build.gradle
├── ci.sh
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── library
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── ru
│ │ └── igla
│ │ └── widget
│ │ └── ApplicationTest.java
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── ru
│ │ └── igla
│ │ └── widget
│ │ ├── AutoSizeTextView.java
│ │ ├── FontSizeUtils.java
│ │ └── StringUtils.java
│ └── res
│ └── values
│ ├── attrs.xml
│ └── strings.xml
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | #build files
2 | gen/
3 | bin/
4 | build/
5 | out/
6 | output/
7 | releases/
8 | R.java
9 |
10 | #idea files
11 | .idea/
12 | *.iml
13 | *.ipr
14 | *.iws
15 |
16 | # conflict files
17 | *.orig
18 | *.chg
19 | *.rej
20 | *.conflict
21 |
22 | # backup files
23 | *.bak
24 |
25 | #eclipse files
26 | local\.properties
27 | target
28 | .classpath
29 | .settings
30 | .project
31 |
32 | #Mac files
33 | .DS_Store
34 |
35 | #hg files
36 | .hg/
37 | .hgignore
38 |
39 | #gradle
40 | .gradle
41 | ant.properties
42 | build.xml
43 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | # Disabling sudo moves build to the Container Based Infrastructure on Travis CI
2 | sudo: false
3 |
4 | language: android
5 | jdk: oraclejdk8
6 |
7 | android:
8 | components:
9 | - platform-tools
10 | - tools
11 | - android-23
12 | - build-tools-23.0.2
13 | - extra-android-m2repository
14 | - extra-android-support
15 | - sys-img-armeabi-v7a-android-18
16 |
17 | before_script:
18 | - echo no | android create avd --force -n test -t android-18 --abi armeabi-v7a
19 | - emulator -avd test -no-skin -no-audio -no-window &
20 | - android-wait-for-emulator
21 | - adb shell input keyevent 82
22 |
23 | script:
24 | - sh ci.sh
25 |
26 | notifications:
27 | email: true
28 |
29 | cache:
30 | directories:
31 | - $HOME/.m2
32 | - $HOME/.gradle
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2015 Igor Lashkov
2 |
3 | Licensed under the Apache License, Version 2.0 (the "License");
4 | you may not use this file except in compliance with the License.
5 | You may obtain a copy of the License at
6 |
7 | http://www.apache.org/licenses/LICENSE-2.0
8 |
9 | Unless required by applicable law or agreed to in writing, software
10 | distributed under the License is distributed on an "AS IS" BASIS,
11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | See the License for the specific language governing permissions and
13 | limitations under the License.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AutoSizeTextView
2 |
3 | [![JitPack][jitpack-svg]][jitpack-link]
4 | [![Build Status][build-status-svg]][build-status-link]
5 | [](https://www.apache.org/licenses/LICENSE-2.0.html)
6 |
7 | An Android TextView that automatically fits its font and line count based on its available size and content
8 |
9 | Based on solutions listed here http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds
10 |
11 |
12 | ## Overview
13 |
14 | - Android 4.0.3+ support
15 | - Widget allows to set minimum text size
16 | - Text size is also adjusted automatically after rotation
17 | - Ellipsis text in case of text length exceeds predefined value
18 |
19 |
20 | # Gradle Dependency
21 |
22 |
23 | #### Repository
24 |
25 | Add this in your root `build.gradle` file (**not** your module `build.gradle` file):
26 |
27 | ```gradle
28 | allprojects {
29 | repositories {
30 | ...
31 | maven { url "https://jitpack.io" }
32 | }
33 | }
34 | ```
35 |
36 | #### Dependency
37 |
38 | Add this to your module's `build.gradle` file:
39 |
40 | ```gradle
41 | dependencies {
42 | compile 'com.github.iglaweb:AutoSizeTextView:v1.0'
43 | }
44 | }
45 | ```
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | Use the built in Widget in code or XML:
54 |
55 | ```xml
56 |
74 | ```
75 |
76 | Issues
77 | ------
78 |
79 | If you find any problems or would like to suggest a feature, please
80 | feel free to file an issue on github at
81 | https://github.com/iglaweb/AutoSizeTextView/issues
82 |
83 | ## License
84 |
85 | Copyright 2015 Igor Lashkov
86 |
87 | Licensed under the Apache License, Version 2.0 (the "License");
88 | you may not use this file except in compliance with the License.
89 | You may obtain a copy of the License at
90 |
91 | http://www.apache.org/licenses/LICENSE-2.0
92 |
93 | Unless required by applicable law or agreed to in writing, software
94 | distributed under the License is distributed on an "AS IS" BASIS,
95 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
96 | See the License for the specific language governing permissions and
97 | limitations under the License.
98 |
99 | [build-status-svg]: https://travis-ci.org/iglaweb/AutoSizeTextView.svg?branch=dev
100 | [build-status-link]: https://travis-ci.org/iglaweb/AutoSizeTextView
101 | [license-svg]: https://img.shields.io/badge/license-APACHE-lightgrey.svg
102 | [license-link]: https://github.com/iglaweb/AutoSizeTextView/blob/dev/LICENSE
103 | [jitpack-svg]: https://img.shields.io/github/release/iglaweb/autosizetextview.svg?label=jitpack
104 | [jitpack-link]: https://jitpack.io/#iglaweb/autosizetextview
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.2"
6 |
7 | defaultConfig {
8 | applicationId "ru.igla.widget.autosizetextview"
9 | minSdkVersion 15
10 | targetSdkVersion 23
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(include: ['*.jar'], dir: 'libs')
24 | testCompile 'junit:junit:4.12'
25 | compile 'com.android.support:appcompat-v7:23.1.1'
26 | compile project(':library')
27 | }
28 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/lashkov/Documents/android-sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/ru/igla/widget/autosizetextview/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package ru.igla.widget.autosizetextview;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/java/ru/igla/widget/autosizetextview/FullscreenActivity.java:
--------------------------------------------------------------------------------
1 | package ru.igla.widget.autosizetextview;
2 |
3 |
4 | import android.app.Activity;
5 | import android.content.Context;
6 | import android.os.Bundle;
7 | import android.text.TextUtils;
8 | import android.view.LayoutInflater;
9 | import android.view.Window;
10 | import android.view.WindowManager;
11 | import android.widget.RelativeLayout;
12 |
13 | import ru.igla.widget.AutoSizeTextView;
14 |
15 | public class FullscreenActivity extends Activity {
16 |
17 | private RelativeLayout activityRoot;
18 | public static final String FULLSCREEN_TEXT = "fullscreen_text";
19 |
20 | @Override
21 | protected void onCreate(Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 |
24 | initiateActivity();
25 | setContentView(activityRoot);
26 | }
27 |
28 | void initiateActivity(){
29 | LayoutInflater inflater = (LayoutInflater)getSystemService
30 | (Context.LAYOUT_INFLATER_SERVICE);
31 | activityRoot = (RelativeLayout)inflater.inflate(R.layout.fullscreen, null);
32 |
33 | Bundle extras = getIntent().getExtras();
34 | if(extras == null){
35 | return;
36 | }
37 |
38 | AutoSizeTextView textView = (AutoSizeTextView)activityRoot.findViewById(R.id.tvFullscreen);
39 | String text = extras.getString(FULLSCREEN_TEXT);
40 | if(TextUtils.isEmpty(text)){
41 | return;
42 | }
43 |
44 | text = text.trim();
45 | String adjusted = text.replaceAll("(?m)^[ \t]*\r?\n", "");
46 | //general hack http://code.google.com/p/android/issues/detail?id=13895
47 | //we should not use single line mode ever due to issue on Samsung Galaxy S5 4.4.2
48 | textView.setText(adjusted);
49 |
50 |
51 | // remove title
52 | requestWindowFeature(Window.FEATURE_NO_TITLE);
53 | getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
54 | WindowManager.LayoutParams.FLAG_FULLSCREEN);
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fullscreen.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iglaweb/AutoSizeTextView/675019b274a8cea5c61b3954ef0612515a20c34e/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iglaweb/AutoSizeTextView/675019b274a8cea5c61b3954ef0612515a20c34e/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iglaweb/AutoSizeTextView/675019b274a8cea5c61b3954ef0612515a20c34e/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iglaweb/AutoSizeTextView/675019b274a8cea5c61b3954ef0612515a20c34e/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iglaweb/AutoSizeTextView/675019b274a8cea5c61b3954ef0612515a20c34e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | AutoSizeTextView
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/test/java/ru/igla/widget/autosizetextview/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package ru.igla.widget.autosizetextview;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * To work on unit tests, switch the Test Artifact in the Build Variants view.
9 | */
10 | public class ExampleUnitTest {
11 | @Test
12 | public void addition_isCorrect() throws Exception {
13 | assertEquals(4, 2 + 2);
14 | }
15 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:1.5.0'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | jcenter()
18 | }
19 | }
20 |
21 | task clean(type: Delete) {
22 | delete rootProject.buildDir
23 | }
24 |
--------------------------------------------------------------------------------
/ci.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Please run it from root project directory
3 |
4 | # This will: compile the project, run lint, run tests under JVM, package apk, check the code quality and run tests on the device/emulator.
5 | ./gradlew clean build connectedAndroidTest -PdisablePreDex
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iglaweb/AutoSizeTextView/675019b274a8cea5c61b3954ef0612515a20c34e/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Oct 21 11:34:03 PDT 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/library/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/library/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.2"
6 |
7 | defaultConfig {
8 | minSdkVersion 15
9 | targetSdkVersion 23
10 | versionCode 1
11 | versionName "1.0"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | }
20 |
21 | dependencies {
22 | compile fileTree(dir: 'libs', include: ['*.jar'])
23 | testCompile 'junit:junit:4.12'
24 | }
25 |
--------------------------------------------------------------------------------
/library/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/lashkov/Documents/android-sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/library/src/androidTest/java/ru/igla/widget/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package ru.igla.widget;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/library/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/library/src/main/java/ru/igla/widget/AutoSizeTextView.java:
--------------------------------------------------------------------------------
1 | package ru.igla.widget;
2 |
3 | /**
4 | * Created by Lashkov Igor on 16/06/15.
5 | * Copyright (c) 2015. All rights reserved.
6 | */
7 |
8 | import android.content.Context;
9 | import android.content.res.Resources;
10 | import android.content.res.TypedArray;
11 | import android.graphics.Canvas;
12 | import android.graphics.Color;
13 | import android.graphics.Paint;
14 | import android.graphics.RectF;
15 | import android.graphics.Typeface;
16 | import android.os.Build;
17 | import android.text.TextPaint;
18 | import android.util.AttributeSet;
19 | import android.util.TypedValue;
20 | import android.view.View;
21 | import android.widget.TextView;
22 |
23 |
24 |
25 | /**
26 | * a textView that is able to self-adjust its font size depending on the min and max size of the font, and its own size.
27 | * code is heavily based on this StackOverflow thread:
28 | * http://stackoverflow.com/questions/16017165/auto-fit-textview-for-android/21851239#21851239
29 | * It should work fine with most Android versions, but might have some issues on Android 3.1 - 4.04, as setTextSize will only work for the first time.
30 | * More info here: https://code.google.com/p/android/issues/detail?id=22493 and here in case you wish to fix it: http://stackoverflow.com/a/21851239/878126
31 | */
32 | public class AutoSizeTextView extends TextView {
33 |
34 | final String ZERO_WIDTH_SPACE = "\u200B";
35 |
36 | // Minimum size of the text in pixels
37 | private static final float DEFAULT_MIN_TEXT_SIZE = 8.0f; //sp
38 |
39 |
40 |
41 |
42 | private static final int NO_LINE_LIMIT = -1;
43 | private final RectF _availableSpaceRect = new RectF();
44 |
45 | private float mMaxTextSize;
46 | private float mMinTextSize = -1;
47 | private int mMaxLines;
48 | private boolean mIsInitialized = false;
49 |
50 | private TextPaint mPaint;
51 | private FontSizeUtils mFontSizeUtils;
52 |
53 | public AutoSizeTextView(final Context context) {
54 | this(context,null,0);
55 | }
56 |
57 | public AutoSizeTextView(final Context context, final AttributeSet attrs) {
58 | this(context, attrs, 0);
59 | }
60 |
61 | public AutoSizeTextView(final Context context, final AttributeSet attrs, final int defStyle) {
62 | super(context, attrs, defStyle);
63 | Init(context, attrs, defStyle);
64 | }
65 |
66 | private void Init(final Context c, final AttributeSet attrs, final int defStyle){
67 |
68 | //check min text size availability
69 | if(attrs != null){
70 | TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.AutoSizeTextView, defStyle, 0);
71 | try {
72 | mMinTextSize = a.getDimension(R.styleable.AutoSizeTextView_minTxtSize, -1);
73 | } finally {
74 | a.recycle();
75 | }
76 | }
77 |
78 | if(mMinTextSize == -1){
79 | mMinTextSize = TypedValue.applyDimension(
80 | TypedValue.COMPLEX_UNIT_SP,
81 | DEFAULT_MIN_TEXT_SIZE, // using the minimal recommended font size
82 | getResources().getDisplayMetrics()
83 | );
84 | }
85 |
86 |
87 | //due to problem of big font size, http://stackoverflow.com/questions/6253528/font-size-too-large-to-fit-in-cache
88 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
89 | setLayerType(View.LAYER_TYPE_SOFTWARE, null);
90 | }
91 |
92 |
93 |
94 |
95 |
96 | mMaxTextSize = getTextSize();
97 |
98 | if(mMaxLines == 0) {
99 | // no value was assigned during construction
100 | mMaxLines = NO_LINE_LIMIT;
101 | }
102 |
103 | mIsInitialized = true;
104 |
105 |
106 | mFontSizeUtils = new FontSizeUtils();
107 | mFontSizeUtils.setSizeTester(
108 | new FontSizeUtils.SizeTester(mMinTextSize, mMaxTextSize));
109 |
110 | mPaint = new TextPaint();
111 | mPaint.setTextAlign(Paint.Align.CENTER);
112 | mPaint.setAntiAlias(true);
113 | mPaint.setColor(Color.BLACK);
114 | mPaint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.NORMAL));
115 | mPaint.setSubpixelText(true);
116 | }
117 |
118 | @Override
119 | public void setTypeface(final Typeface tf) {
120 |
121 | if(mPaint == null) {
122 | mPaint = new TextPaint(getPaint());
123 | }
124 |
125 | mPaint.setTypeface(tf);
126 | adjustTextSize();
127 | super.setTypeface(tf);
128 | }
129 |
130 | @Override
131 | public void setTextSize(final float size) {
132 | mMaxTextSize = size;
133 | adjustTextSize();
134 | }
135 |
136 | @Override
137 | public void setMaxLines(final int maxlines) {
138 | super.setMaxLines(maxlines);
139 | mMaxLines = maxlines;
140 | reAdjust();
141 | }
142 |
143 | @Override
144 | public int getMaxLines() {
145 | return mMaxLines;
146 | }
147 |
148 | @Override
149 | public void setSingleLine() {
150 | super.setSingleLine();
151 | mMaxLines = 1;
152 | reAdjust();
153 | }
154 |
155 | @Override
156 | public void setSingleLine(final boolean singleLine) {
157 | super.setSingleLine(singleLine);
158 | mMaxLines = singleLine ? 1 : NO_LINE_LIMIT;
159 | reAdjust();
160 | }
161 |
162 | @Override
163 | public void setLines(final int lines) {
164 | super.setLines(lines);
165 | mMaxLines = lines;
166 | reAdjust();
167 | }
168 |
169 | @Override
170 | public void setTextSize(final int unit,final float size) {
171 | final Context c = getContext();
172 |
173 | Resources r = c == null ?
174 | Resources.getSystem() :
175 | c.getResources();
176 |
177 | mMaxTextSize = TypedValue.applyDimension(unit,size,r.getDisplayMetrics());
178 | if(mFontSizeUtils.getSizeTester() != null){
179 | mFontSizeUtils.getSizeTester().setMaxTextSize(mMaxTextSize);
180 | }
181 |
182 | adjustTextSize();
183 | }
184 |
185 | /**
186 | * Set the lower text size limit and invalidate the view
187 | *
188 | * @param minTextSize
189 | */
190 | public void setMinTextSize(final float minTextSize) {
191 | mMinTextSize = minTextSize;
192 |
193 | if(mFontSizeUtils.getSizeTester() != null){
194 | mFontSizeUtils.getSizeTester().setMinTextSize(minTextSize);
195 | }
196 |
197 | reAdjust();
198 | }
199 |
200 | private void reAdjust() {
201 | adjustTextSize();
202 | }
203 |
204 | private void adjustTextSize() {
205 | if(!mIsInitialized) {
206 | return;
207 | }
208 |
209 | final int heightLimit = getMeasuredHeight() - getCompoundPaddingBottom() - getCompoundPaddingTop();
210 | final int _widthLimit = getMeasuredWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight();
211 | if(_widthLimit <= 0) {
212 | return;
213 | }
214 |
215 | _availableSpaceRect.right = _widthLimit;
216 | _availableSpaceRect.bottom = heightLimit;
217 | superSetTextSize();
218 | }
219 |
220 | private void superSetTextSize() {
221 |
222 | float size = efficientTextSizeSearch(_availableSpaceRect);
223 |
224 | super.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
225 |
226 | String newText = getText().toString().trim();
227 | if(size - 1 <= mMinTextSize){
228 | newText = StringUtils.ellipsizeText(newText, _availableSpaceRect.width(), mPaint);
229 | }
230 |
231 | //workaround http://code.google.com/p/android/issues/detail?id=17343#c9
232 | //http://stackoverflow.com/a/13377239/1461625
233 | String fixString = "";
234 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1
235 | && Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
236 | fixString = ZERO_WIDTH_SPACE;
237 | }
238 |
239 | super.setText(newText + fixString);
240 | }
241 |
242 | private float efficientTextSizeSearch(final RectF availableSpace) {
243 |
244 | String text = getText().toString().trim();
245 |
246 | boolean isSingleLine = StringUtils.isSingleLine(text);
247 |
248 | float newSize = mFontSizeUtils.getFontSize(text, isSingleLine, availableSpace, mPaint);
249 | System.out.println(newSize);
250 |
251 | return newSize;
252 | }
253 |
254 | @Override
255 | protected void onSizeChanged(final int width,final int height,final int oldwidth,final int oldheight) {
256 | super.onSizeChanged(width, height, oldwidth, oldheight);
257 | if(width!=oldwidth||height!=oldheight)
258 | reAdjust();
259 | }
260 |
261 | /**
262 | * Resize text after measuring
263 | */
264 | @Override
265 | protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
266 | super.onLayout(changed, left, top, right, bottom);
267 | }
268 |
269 | Paint.FontMetricsInt fontMetricsInt;
270 |
271 | @Override
272 | protected void onDraw(Canvas canvas) {
273 | if (fontMetricsInt == null){
274 | fontMetricsInt = new Paint.FontMetricsInt();
275 | getPaint().getFontMetricsInt(fontMetricsInt);
276 | }
277 | canvas.translate(0, fontMetricsInt.top - fontMetricsInt.ascent);
278 | super.onDraw(canvas);
279 | }
280 | }
--------------------------------------------------------------------------------
/library/src/main/java/ru/igla/widget/FontSizeUtils.java:
--------------------------------------------------------------------------------
1 | package ru.igla.widget;
2 |
3 | import android.graphics.Rect;
4 | import android.graphics.RectF;
5 | import android.text.Layout;
6 | import android.text.StaticLayout;
7 | import android.text.TextPaint;
8 | import android.text.TextUtils;
9 |
10 | /**
11 | * Created by Lashkov Igor on 22/06/15.
12 | * Copyright (c) 2015. All rights reserved.
13 | */
14 | public class FontSizeUtils {
15 |
16 | private static final float MAX_TEXT_SIZE = 100.0f;
17 | private static final float MIN_TEXT_SIZE = 8.0f;
18 |
19 |
20 | private SizeTester sizeTester;
21 |
22 | public SizeTester getSizeTester() {
23 | return sizeTester;
24 | }
25 |
26 | public void setSizeTester(SizeTester sizeTester) {
27 | this.sizeTester = sizeTester;
28 | }
29 |
30 |
31 | public static class SizeTester {
32 | private float minTextSize;
33 | private float maxTextSize;
34 |
35 | private float padding = 0f;
36 |
37 | public SizeTester(float minTextSize, float maxTextSize){
38 | this.minTextSize = minTextSize;
39 | this.maxTextSize = maxTextSize;
40 | }
41 |
42 | public float getMinTextSize() {
43 | return minTextSize;
44 | }
45 |
46 | public void setMinTextSize(float minTextSize) {
47 | this.minTextSize = minTextSize;
48 | }
49 |
50 | public float getMaxTextSize() {
51 | return maxTextSize;
52 | }
53 |
54 | public void setMaxTextSize(float maxTextSize) {
55 | this.maxTextSize = maxTextSize;
56 | }
57 |
58 | public float getPadding() {
59 | return padding;
60 | }
61 |
62 | public void setPadding(float padding) {
63 | this.padding = padding;
64 | }
65 | }
66 |
67 |
68 |
69 |
70 | private static boolean testFontSize(String text, RectF availableSpace, TextPaint tp, boolean singleLine){
71 | return /*singleLine ?
72 | testFontSizeSingleline(text, availableSpace, tp) :*/
73 | testMultilineSize(text, availableSpace, tp);
74 | }
75 |
76 | private static boolean testMultilineSize(String text, RectF availableSpace, TextPaint tp){
77 |
78 | StaticLayout sl = new StaticLayout(
79 | text,
80 | tp,
81 | (int)availableSpace.width(),
82 | Layout.Alignment.ALIGN_CENTER,
83 | 1.0f,
84 | 0.0f,
85 | true
86 | );
87 |
88 | float lineHeight = tp.getFontSpacing();
89 |
90 | final RectF textRect = new RectF();
91 |
92 | int maxHeight = sl.getHeight();
93 | textRect.bottom = maxHeight;
94 | int maxWidth = -1;
95 | for(int i = 0; i < sl.getLineCount(); i++)
96 | if(maxWidth < sl.getLineRight(i) - sl.getLineLeft(i))
97 | maxWidth = (int)sl.getLineRight(i) - (int)sl.getLineLeft(i);
98 |
99 | maxWidth += 5; //hack for Nexus 7 https://st.yandex-team.ru/MT-2386
100 |
101 | textRect.right = maxWidth;
102 |
103 | textRect.offsetTo(0,0);
104 |
105 |
106 | //bug; we need to know the longest word, as it should not have any breaks
107 | String word = StringUtils.getLongestWord(text) + text.charAt(0); //huck
108 | float measureWidth = tp.measureText(word);
109 |
110 |
111 |
112 |
113 |
114 | Rect boundsLWord = new Rect();
115 | tp.getTextBounds(word, 0, word.length(), boundsLWord);
116 |
117 |
118 |
119 |
120 |
121 |
122 | final float avHeight = availableSpace.height();
123 | final float avWidth = availableSpace.width();
124 |
125 |
126 | //check if longest word fits width
127 | CharSequence t = TextUtils.ellipsize(word, tp, avWidth, TextUtils.TruncateAt.END);
128 | if(!TextUtils.equals(word, t)){ //if we have a truncated text
129 | return false; // too big
130 | }
131 |
132 |
133 | if(maxHeight >= avHeight ||
134 | maxWidth >= avWidth ||
135 | measureWidth >= avWidth ||
136 | boundsLWord.height() >= avHeight ||
137 | boundsLWord.width() >= avWidth){
138 | return false; //too big
139 | } else {
140 | //Log.e("TOO SMALL rect: " + textRect.toShortString() + " available: " + availableSpace.toShortString());
141 | return true; //too small
142 | }
143 | }
144 |
145 |
146 | private static boolean testFontSizeSingleline(String text, RectF availableSpace, TextPaint tp){
147 |
148 | Rect bounds = new Rect();
149 |
150 | float lineHeight = tp.getFontSpacing();
151 | float measureWidth = tp.measureText(text);
152 |
153 | tp.getTextBounds(text, 0, text.length(), bounds);
154 |
155 | if(measureWidth >= availableSpace.width() ||
156 | lineHeight >= availableSpace.height() ||
157 | bounds.height() >= availableSpace.height()) {
158 | return false; // too big
159 | }
160 | return true; // too small
161 | }
162 |
163 |
164 |
165 | public int getFontSize(String text, boolean isSingleLine, RectF availableSpace, TextPaint tp){
166 |
167 | float max = sizeTester == null ? MAX_TEXT_SIZE : sizeTester.getMaxTextSize();
168 | float min = sizeTester == null ? MIN_TEXT_SIZE : sizeTester.getMinTextSize();
169 |
170 | int start = (int)min;
171 |
172 | int lastBest = start;
173 |
174 | int hi = (int)max;
175 | int lo = start;
176 |
177 | int mid;
178 | while(hi - lo > 1) {
179 |
180 | mid = lo + hi >>> 1;
181 |
182 | tp.setTextSize(mid);
183 | boolean flag = testFontSize(text, availableSpace, tp, isSingleLine);
184 |
185 | if(flag) {
186 | lastBest = lo;
187 | lo = mid + 1;
188 | } else {
189 | hi = mid - 1;
190 | lastBest = hi;
191 | }
192 | }
193 | return lastBest;
194 | }
195 | }
196 |
--------------------------------------------------------------------------------
/library/src/main/java/ru/igla/widget/StringUtils.java:
--------------------------------------------------------------------------------
1 | package ru.igla.widget;
2 |
3 | import android.text.TextPaint;
4 | import android.text.TextUtils;
5 |
6 | import java.util.StringTokenizer;
7 |
8 | /**
9 | * Created by lashkov on 24/12/15.
10 | * Copyright (c) 2015. All rights reserved.
11 | */
12 | public class StringUtils {
13 |
14 | public static boolean isSingleLine(String text){
15 | StringTokenizer st = new StringTokenizer(text);
16 | return st.countTokens() < 2;
17 | }
18 |
19 | /***
20 | * Get the longest word in a text by splitting it by spaces
21 | * @param text
22 | * @return
23 | */
24 | public static String getLongestWord(String text){
25 | StringTokenizer st = new StringTokenizer(text);
26 | String result = "";
27 | while (st.hasMoreTokens()) {
28 | String s = st.nextToken();
29 | if(s.length() > result.length()){
30 | result = s;
31 | }
32 | }
33 | return result;
34 | }
35 |
36 | /***
37 | * Ellipsize words if they do not fit a line
38 | * @param text text to be checked
39 | * @param width available width for the text
40 | * @param tp used textpaint to draw text
41 | * @return formatted text
42 | */
43 | public static String ellipsizeText(final String text, float width, final TextPaint tp){
44 | String str = text;
45 |
46 | StringTokenizer st = new StringTokenizer(text);
47 | while (st.hasMoreTokens()) {
48 |
49 | String s = st.nextToken();
50 |
51 | CharSequence t = TextUtils.ellipsize(s, tp, width, TextUtils.TruncateAt.END);
52 | if(!TextUtils.equals(t, s)){
53 | str = str.replace(s, t);
54 | }
55 | }
56 | return str;
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/library/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/library/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | AutoSizeTextView
3 |
4 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':library'
2 |
--------------------------------------------------------------------------------