[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <codeStyleSettings language=\"XML\">\n      <indentOptions>\n        <option name=\"CONTINUATION_INDENT_SIZE\" value=\"4\" />\n      </indentOptions>\n      <arrangement>\n        <rules>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:android</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:id</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>style</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>ANDROID_ATTRIBUTE_ORDER</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>.*</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n        </rules>\n      </arrangement>\n    </codeStyleSettings>\n  </code_scheme>\n</component>"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTargetLevel target=\"1.8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"testRunner\" value=\"GRADLE\" />\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n            <option value=\"$PROJECT_DIR$/pswedittextlibrary\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/inspectionProfiles/Project_Default.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"JavaDoc\" enabled=\"true\" level=\"WARNING\" enabled_by_default=\"true\">\n      <option name=\"TOP_LEVEL_CLASS_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"INNER_CLASS_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"METHOD_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"@return@param@throws or @exception\" />\n        </value>\n      </option>\n      <option name=\"FIELD_OPTIONS\">\n        <value>\n          <option name=\"ACCESS_JAVADOC_REQUIRED_FOR\" value=\"none\" />\n          <option name=\"REQUIRED_TAGS\" value=\"\" />\n        </value>\n      </option>\n      <option name=\"IGNORE_DEPRECATED\" value=\"false\" />\n      <option name=\"IGNORE_JAVADOC_PERIOD\" value=\"true\" />\n      <option name=\"IGNORE_DUPLICATED_THROWS\" value=\"false\" />\n      <option name=\"IGNORE_POINT_TO_ITSELF\" value=\"false\" />\n      <option name=\"myAdditionalJavadocTags\" value=\"date\" />\n    </inspection_tool>\n  </profile>\n</component>"
  },
  {
    "path": ".idea/jarRepositories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RemoteRepositoriesConfiguration\">\n    <remote-repository>\n      <option name=\"id\" value=\"central\" />\n      <option name=\"name\" value=\"Maven Central repository\" />\n      <option name=\"url\" value=\"https://repo1.maven.org/maven2\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"jboss.community\" />\n      <option name=\"name\" value=\"JBoss Community repository\" />\n      <option name=\"url\" value=\"https://repository.jboss.org/nexus/content/repositories/public/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"BintrayJCenter\" />\n      <option name=\"name\" value=\"BintrayJCenter\" />\n      <option name=\"url\" value=\"https://jcenter.bintray.com/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"maven\" />\n      <option name=\"name\" value=\"maven\" />\n      <option name=\"url\" value=\"https://jitpack.io\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"Google\" />\n      <option name=\"name\" value=\"Google\" />\n      <option name=\"url\" value=\"https://dl.google.com/dl/android/maven2/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"$USER_HOME$/Develop/Android/android_sdk/extras/android/m2repository\" />\n      <option name=\"name\" value=\"$USER_HOME$/Develop/Android/android_sdk/extras/android/m2repository\" />\n      <option name=\"url\" value=\"file:$USER_HOME$/Develop/Android/android_sdk/extras/android/m2repository/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"$USER_HOME$/Develop/Android/android_sdk/extras/google/m2repository\" />\n      <option name=\"name\" value=\"$USER_HOME$/Develop/Android/android_sdk/extras/google/m2repository\" />\n      <option name=\"url\" value=\"file:$USER_HOME$/Develop/Android/android_sdk/extras/google/m2repository/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"$USER_HOME$/Develop/Android/android_sdk/extras/m2repository\" />\n      <option name=\"name\" value=\"$USER_HOME$/Develop/Android/android_sdk/extras/m2repository\" />\n      <option name=\"url\" value=\"file:$USER_HOME$/Develop/Android/android_sdk/extras/m2repository/\" />\n    </remote-repository>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ASMIdeaPluginConfiguration\">\n    <asm skipDebug=\"false\" skipFrames=\"false\" skipCode=\"false\" expandFrames=\"false\" />\n    <groovy codeStyle=\"LEGACY\" />\n  </component>\n  <component name=\"ASMPluginConfiguration\">\n    <asm skipDebug=\"false\" skipFrames=\"false\" skipCode=\"false\" expandFrames=\"false\" />\n    <groovy codeStyle=\"LEGACY\" />\n  </component>\n  <component name=\"DesignSurface\">\n    <option name=\"filePathToZoomLevelMap\">\n      <map>\n        <entry key=\"app/src/main/res/layout/activity_main.xml\" value=\"0.10612968591691996\" />\n      </map>\n    </option>\n  </component>\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"13\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n          <item index=\"4\" class=\"java.lang.String\" itemvalue=\"javax.annotation.CheckForNull\" />\n          <item index=\"5\" class=\"java.lang.String\" itemvalue=\"androidx.annotation.Nullable\" />\n          <item index=\"6\" class=\"java.lang.String\" itemvalue=\"androidx.annotation.RecentlyNullable\" />\n          <item index=\"7\" class=\"java.lang.String\" itemvalue=\"org.checkerframework.checker.nullness.qual.Nullable\" />\n          <item index=\"8\" class=\"java.lang.String\" itemvalue=\"org.checkerframework.checker.nullness.compatqual.NullableDecl\" />\n          <item index=\"9\" class=\"java.lang.String\" itemvalue=\"org.checkerframework.checker.nullness.compatqual.NullableType\" />\n          <item index=\"10\" class=\"java.lang.String\" itemvalue=\"android.annotation.Nullable\" />\n          <item index=\"11\" class=\"java.lang.String\" itemvalue=\"com.android.annotations.Nullable\" />\n          <item index=\"12\" class=\"java.lang.String\" itemvalue=\"org.eclipse.jdt.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"12\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n          <item index=\"4\" class=\"java.lang.String\" itemvalue=\"androidx.annotation.NonNull\" />\n          <item index=\"5\" class=\"java.lang.String\" itemvalue=\"androidx.annotation.RecentlyNonNull\" />\n          <item index=\"6\" class=\"java.lang.String\" itemvalue=\"org.checkerframework.checker.nullness.qual.NonNull\" />\n          <item index=\"7\" class=\"java.lang.String\" itemvalue=\"org.checkerframework.checker.nullness.compatqual.NonNullDecl\" />\n          <item index=\"8\" class=\"java.lang.String\" itemvalue=\"org.checkerframework.checker.nullness.compatqual.NonNullType\" />\n          <item index=\"9\" class=\"java.lang.String\" itemvalue=\"android.annotation.NonNull\" />\n          <item index=\"10\" class=\"java.lang.String\" itemvalue=\"com.android.annotations.NonNull\" />\n          <item index=\"11\" class=\"java.lang.String\" itemvalue=\"org.eclipse.jdt.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_8\" default=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/MNPasswordEditText.iml\" filepath=\"$PROJECT_DIR$/MNPasswordEditText.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/app/MNPasswordEditText.app.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/app/MNPasswordEditText.app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/pswedittextlibrary/MNPasswordEditText.pswedittextlibrary.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/pswedittextlibrary/MNPasswordEditText.pswedittextlibrary.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "# MNPasswordEditText [![](https://jitpack.io/v/maning0303/MNPasswordEditText.svg)](https://jitpack.io/#maning0303/MNPasswordEditText)\nAndroid验证码和密码输入框，能自定义输入框个数和样式（连体，下划线和方形框）\n类似微信支付宝的密码输入框等\n\n\n## 截图：\n![](https://github.com/maning0303/MNPasswordEditText/raw/master/screenshots/mn_pswedittext_001.jpeg)\n![](https://github.com/maning0303/MNPasswordEditText/raw/master/screenshots/mn_pswedittext_002.jpeg)\n\n\n## 如何添加\n### 1:Gradle添加：\n#### 1.在Project的build.gradle中添加仓库地址\n\n``` gradle\n\tallprojects {\n\t\trepositories {\n\t\t\t...\n\t\t\tmaven { url \"https://jitpack.io\" }\n\t\t}\n\t}\n```\n\n#### 2.在app目录下的build.gradle中添加依赖\n``` gradle\n\tdependencies {\n\t     implementation 'com.github.maning0303:MNPasswordEditText:V1.0.4'\n\t}\n```\n\n### 2:源码Module添加：\n#### 直接关联pswedittextlibrary\n\n``` gradle\n\n\timplementation project(':pswedittextlibrary')\n\n```\n\n## 使用方法(查看Demo详情):\n\n### 1:自定义参数介绍:\n``` java\n\n<declare-styleable name=\"MNPasswordEditText\">\n        <!--密码框的颜色-->\n        <attr name=\"psw_border_color\" format=\"color\" />\n        <!--密码框选中的颜色-->\n        <attr name=\"psw_border_selected_color\" format=\"color\" />\n        <!--密码文字的颜色,圆形密码颜色-->\n        <attr name=\"psw_text_color\" format=\"color\" />\n        <!--密码框的圆角-->\n        <attr name=\"psw_border_radius\" format=\"dimension\" />\n        <!--密码框的线的大小-->\n        <attr name=\"psw_border_width\" format=\"dimension\" />\n        <!--密码框的每个间隔,只有样式2才起作用-->\n        <attr name=\"psw_item_margin\" format=\"dimension\" />\n        <!--密码框背景色-->\n        <attr name=\"psw_background_color\" format=\"color\" />\n        <!--密码框输入的模式:4.明文,3.文字,2.图片,1.圆形-->\n        <attr name=\"psw_mode\" format=\"enum\">\n            <!--圆形默认-->\n            <enum name=\"Circle\" value=\"1\" />\n            <!--图片-->\n            <enum name=\"Bitmap\" value=\"2\" />\n            <!--文本-->\n            <enum name=\"Text\" value=\"3\" />\n            <!--原始-->\n            <enum name=\"OriginalText\" value=\"4\" />\n        </attr>\n        <!--密码框样式: 1.连在一起 2.分开单独显示  3.下划线形式-->\n        <attr name=\"psw_style\" format=\"enum\">\n            <!--连在一起-->\n            <enum name=\"StyleDefault\" value=\"1\" />\n            <!--单独-->\n            <enum name=\"StyleOneself\" value=\"2\" />\n            <!--下划线形式-->\n            <enum name=\"StyleUnderLine\" value=\"3\" />\n        </attr>\n        <!--密码文字遮盖-->\n        <attr name=\"psw_cover_text\" format=\"string\" />\n        <!--密码图片遮盖-->\n        <attr name=\"psw_cover_bitmap_id\" format=\"reference\" />\n        <!--密码圆形遮盖颜色-->\n        <attr name=\"psw_cover_circle_color\" format=\"color\" />\n        <!--密码圆形遮盖半径-->\n        <attr name=\"psw_cover_circle_radius\" format=\"dimension\" />\n        <!--密码图片遮盖长宽-->\n        <attr name=\"psw_cover_bitmap_width\" format=\"dimension\" />\n        <!--是否显示光标-->\n        <attr name=\"psw_show_cursor\" format=\"boolean\" />\n        <!--光标颜色-->\n        <attr name=\"psw_cursor_color\" format=\"color\" />\n        <!--光标高度-->\n        <attr name=\"psw_cursor_height\" format=\"dimension\" />\n        <!--光标宽度-->\n        <attr name=\"psw_cursor_width\" format=\"dimension\" />\n        <!--光标圆角-->\n        <attr name=\"psw_cursor_corner_radius\" format=\"dimension\" />\n\n    </declare-styleable>\n\n```\n\n### 2:布局文件使用（详细查看Demo）:\n``` java\n\n       <com.maning.pswedittextlibrary.MNPasswordEditText\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_marginTop=\"10dp\"\n            android:focusableInTouchMode=\"true\"\n            android:inputType=\"number\"\n            android:maxLength=\"6\"\n            android:textSize=\"20sp\"\n            app:psw_border_color=\"#267eb4\"\n            app:psw_border_radius=\"4dp\"\n            app:psw_border_selected_color=\"#dc10a2\"\n            app:psw_border_width=\"2dp\"\n            app:psw_cover_text=\"密\"\n            app:psw_cursor_width=\"10dp\"\n            app:psw_item_margin=\"10dp\"\n            app:psw_mode=\"Text\"\n            app:psw_show_cursor=\"true\"\n            app:psw_style=\"StyleOneself\"\n            app:psw_text_color=\"#393939\" /\n\n```\n\n### 2:代码相关:\n``` java\n\n    mPswEditText = (MNPasswordEditText) findViewById(R.id.mPswEditText);\n    //监听输入的过程\n    mPswEditText.setOnTextChangeListener(new MNPasswordEditText.OnTextChangeListener() {\n        @Override\n        public void onTextChange(String text, boolean isComplete) {\n            tvShow.setText(text);\n            if (isComplete) {\n                Toast.makeText(MainActivity.this, \"输入完成\", Toast.LENGTH_SHORT).show();\n            }\n        }\n    });\n\n```\n\n## 其他详情请查看Demo\n\n\n## 版本记录：\n    v1.0.4:\n        1.新增光标显示\n        2.自定义属性名称调整\n\n\n## 推荐:\nName | Describe |\n--- | --- |\n[GankMM](https://github.com/maning0303/GankMM) | （Material Design & MVP & Retrofit + OKHttp & RecyclerView ...）Gank.io Android客户端：每天一张美女图片，一个视频短片，若干Android，iOS等程序干货，周一到周五每天更新，数据全部由 干货集中营 提供,持续更新。 |\n[MNUpdateAPK](https://github.com/maning0303/MNUpdateAPK) | Android APK 版本更新的下载和安装 |\n[MNImageBrowser](https://github.com/maning0303/MNImageBrowser) | 交互特效的图片浏览框架,微信向下滑动动态关闭 |\n[MClearEditText](https://github.com/maning0303/MClearEditText) | 带有删除功能的EditText |\n[MNPasswordEditText](https://github.com/maning0303/MNPasswordEditText) | 类似微信支付宝的密码输入框。 |\n[MNCrashMonitor](https://github.com/maning0303/MNCrashMonitor) | Debug监听程序崩溃日志,展示崩溃日志列表，方便自己平时调试。 |\n[MNProgressHUD](https://github.com/maning0303/MNProgressHUD) | MNProgressHUD是对常用的自定义弹框封装,加载ProgressDialog,状态显示的StatusDialog和自定义Toast,支持背景颜色,圆角,边框和文字的自定义。 |\n[MNZXingCode](https://github.com/maning0303/MNZXingCode) | 快速集成二维码扫描和生成二维码 |\n[MNMLKitScanner](https://github.com/maning0303/MNMLKitScanner) | 基于Google ML Kit 快速集成二维码扫描 |\n[MNChangeSkin](https://github.com/maning0303/MNChangeSkin) | Android夜间模式，通过Theme实现 |\n[MNVideoPlayer](https://github.com/maning0303/MNVideoPlayer) | SurfaceView + MediaPlayer 实现的视频播放器，支持横竖屏切换，手势快进快退、调节音量，亮度等。------代码简单，新手可以看一看。 |\n[SwitcherView](https://github.com/maning0303/SwitcherView) | 垂直滚动的广告栏文字展示。 |\n[MNCalendar](https://github.com/maning0303/MNCalendar) | 简单的日历控件练习，水平方向日历支持手势滑动切换，跳转月份；垂直方向日历选取区间范围。 |\n[MNSwipeToLoadDemo](https://github.com/maning0303/MNSwipeToLoadDemo) | 利用SwipeToLoadLayout实现的各种下拉刷新效果（饿了吗，京东，百度外卖，美团外卖，天猫下拉刷新等）。 |\n\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n    defaultConfig {\n        applicationId \"com.maning.mnpasswordedittext\"\n        minSdkVersion 14\n        targetSdkVersion 28\n        versionCode 104\n        versionName \"1.0.4\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(include: ['*.jar'], dir: 'libs')\n\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n    implementation 'androidx.annotation:annotation:1.2.0'\n    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'\n    //测试Gradle\n//    implementation 'com.github.maning0303:MNPasswordEditText:V1.0.4'\n\n    implementation project(':pswedittextlibrary')\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/maning/Develop/Android/SDK/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.maning.mnpasswordedittext\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/maning/mnpasswordedittext/MainActivity.java",
    "content": "package com.maning.mnpasswordedittext;\n\nimport android.os.Bundle;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.maning.pswedittextlibrary.MNPasswordEditText;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private MNPasswordEditText mPswEditText;\n    private TextView tvShow;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        tvShow = (TextView) findViewById(R.id.tvShow);\n        mPswEditText = (MNPasswordEditText) findViewById(R.id.mPswEditText);\n        mPswEditText.setOnTextChangeListener(new MNPasswordEditText.OnTextChangeListener() {\n            @Override\n            public void onTextChange(String text, boolean isComplete) {\n                tvShow.setText(text);\n                if (isComplete) {\n                    Toast.makeText(MainActivity.this, \"输入完成\", Toast.LENGTH_SHORT).show();\n                }\n            }\n        });\n\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_horizontal\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <TextView\n            android:id=\"@+id/tvShow\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"\" />\n\n\n        <com.maning.pswedittextlibrary.MNPasswordEditText\n            android:id=\"@+id/mPswEditText\"\n            android:layout_width=\"300dp\"\n            android:layout_height=\"50dp\"\n            android:layout_marginTop=\"10dp\"\n            android:focusableInTouchMode=\"true\"\n            android:inputType=\"number\"\n            android:maxLength=\"6\"\n            android:textSize=\"20sp\"\n            app:psw_cover_circle_color=\"@color/colorPrimaryDark\"\n            app:psw_cover_circle_radius=\"12dp\"\n            app:psw_show_cursor=\"true\" />\n\n        <com.maning.pswedittextlibrary.MNPasswordEditText\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginTop=\"10dp\"\n            android:focusableInTouchMode=\"true\"\n            android:inputType=\"number\"\n            android:maxLength=\"6\"\n            android:textSize=\"20sp\"\n            app:psw_border_color=\"#c9c9c9\"\n            app:psw_border_selected_color=\"#FF0000\"\n            app:psw_border_width=\"2dp\"\n            app:psw_cover_text=\"码\"\n            app:psw_item_margin=\"20dp\"\n            app:psw_mode=\"Text\"\n            app:psw_show_cursor=\"false\"\n            app:psw_style=\"StyleUnderLine\"\n            app:psw_text_color=\"#393939\" />\n\n        <com.maning.pswedittextlibrary.MNPasswordEditText\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_marginTop=\"10dp\"\n            android:focusableInTouchMode=\"true\"\n            android:inputType=\"number\"\n            android:maxLength=\"5\"\n            android:textSize=\"20sp\"\n            app:psw_background_color=\"#cfcfcf\"\n            app:psw_border_color=\"#3D5AFE\"\n            app:psw_border_radius=\"100dp\"\n            app:psw_border_selected_color=\"#46c4b1\"\n            app:psw_border_width=\"1dp\"\n            app:psw_cursor_color=\"#FF9900\"\n            app:psw_cursor_corner_radius=\"4dp\"\n            app:psw_cursor_height=\"20dp\"\n            app:psw_cursor_width=\"2dp\"\n            app:psw_item_margin=\"20dp\"\n            app:psw_mode=\"OriginalText\"\n            app:psw_show_cursor=\"true\"\n            app:psw_style=\"StyleOneself\"\n            app:psw_text_color=\"#FFFFFF\" />\n\n        <com.maning.pswedittextlibrary.MNPasswordEditText\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_marginTop=\"10dp\"\n            android:focusableInTouchMode=\"true\"\n            android:inputType=\"number\"\n            android:maxLength=\"4\"\n            android:textSize=\"20sp\"\n            app:psw_background_color=\"#FFFFFF\"\n            app:psw_border_color=\"#7e7e7e\"\n            app:psw_border_radius=\"10dp\"\n            app:psw_border_selected_color=\"#dcce10\"\n            app:psw_border_width=\"2dp\"\n            app:psw_cover_bitmap_id=\"@mipmap/ic_launcher\"\n            app:psw_cover_bitmap_width=\"30dp\"\n            app:psw_cursor_corner_radius=\"4dp\"\n            app:psw_cursor_height=\"20dp\"\n            app:psw_cursor_width=\"2dp\"\n            app:psw_item_margin=\"40dp\"\n            app:psw_mode=\"Bitmap\"\n            app:psw_show_cursor=\"true\"\n            app:psw_style=\"StyleOneself\"\n            app:psw_text_color=\"#393939\" />\n\n        <com.maning.pswedittextlibrary.MNPasswordEditText\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_marginTop=\"10dp\"\n            android:focusableInTouchMode=\"true\"\n            android:inputType=\"number\"\n            android:maxLength=\"6\"\n            android:textSize=\"20sp\"\n            app:psw_border_color=\"#267eb4\"\n            app:psw_border_radius=\"4dp\"\n            app:psw_border_selected_color=\"#dc10a2\"\n            app:psw_border_width=\"2dp\"\n            app:psw_cover_text=\"密\"\n            app:psw_cursor_width=\"10dp\"\n            app:psw_item_margin=\"10dp\"\n            app:psw_mode=\"Text\"\n            app:psw_show_cursor=\"true\"\n            app:psw_style=\"StyleOneself\"\n            app:psw_text_color=\"#393939\" />\n\n        <com.maning.pswedittextlibrary.MNPasswordEditText\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_marginTop=\"10dp\"\n            android:focusableInTouchMode=\"true\"\n            android:inputType=\"number\"\n            android:maxLength=\"9\"\n            android:textSize=\"20sp\"\n            app:psw_border_color=\"#FF9800\"\n            app:psw_border_radius=\"4dp\"\n            app:psw_border_selected_color=\"#8BC34A\"\n            app:psw_border_width=\"2dp\"\n            app:psw_cover_circle_color=\"#8BC34A\"\n            app:psw_cover_circle_radius=\"10dp\"\n            app:psw_item_margin=\"10dp\"\n            app:psw_mode=\"Circle\"\n            app:psw_style=\"StyleOneself\"\n            app:psw_text_color=\"#393939\" />\n\n\n    </LinearLayout>\n\n</ScrollView>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">MNPasswordEditText</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        google()\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.0.0'\n        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.1.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\nandroid.enableJetifier=true\nandroid.useAndroidX=true\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "pswedittextlibrary/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "pswedittextlibrary/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'com.github.dcendents.android-maven'\n\ngroup='com.github.maning0303'\n\nandroid {\n    compileSdkVersion 29\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 28\n        versionCode 1\n        versionName \"1.0\"\n\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    compileOnly 'androidx.legacy:legacy-support-v4:1.0.0'\n    compileOnly 'androidx.annotation:annotation:1.2.0'\n}\n"
  },
  {
    "path": "pswedittextlibrary/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/maning/Develop/Android/SDK/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "pswedittextlibrary/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.maning.pswedittextlibrary\">\n\n    <application android:allowBackup=\"true\"\n                 android:label=\"@string/app_name\"\n                 android:supportsRtl=\"true\"\n    >\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "pswedittextlibrary/src/main/java/com/maning/pswedittextlibrary/MNPasswordEditText.java",
    "content": "package com.maning.pswedittextlibrary;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.PixelFormat;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.GradientDrawable;\nimport android.os.Build;\nimport android.text.InputFilter;\nimport android.text.TextUtils;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.EditText;\n\nimport java.lang.reflect.Field;\n\n/**\n * @author : maning\n * @desc :   验证码和密码的输入框\n */\npublic class MNPasswordEditText extends EditText {\n\n    private static final String TAG = \"MNPasswordEditText\";\n\n    private Context mContext;\n    private String defaultColor = \"#FF0000\";\n    /**\n     * 长度\n     */\n    private int maxLength;\n    /**\n     * 文字的颜色\n     */\n    private int textColor;\n    /**\n     * 文字的画笔\n     */\n    private Paint mPaintText;\n    /**\n     * 线框的画笔\n     */\n    private Paint mPaintLine;\n    /**\n     * 背景色\n     */\n    private int backgroundColor;\n    /**\n     * 线框的颜色\n     */\n    private int borderColor;\n    /**\n     * 线框被选中的颜色\n     */\n    private int borderSelectedColor;\n    /**\n     * 线框的圆角\n     */\n    private float borderRadius;\n    /**\n     * 线框的宽度\n     */\n    private float borderWidth;\n    /**\n     * 密码框的间隔\n     */\n    private float itemMargin;\n    /**\n     * 输入的类型\n     */\n    private int inputMode;\n    /**\n     * 样式\n     */\n    private int editTextStyle;\n    /**\n     * 文字遮盖\n     */\n    private String coverText;\n    /**\n     * 图片遮盖\n     */\n    private int coverBitmapID;\n    /**\n     * 图片宽度\n     */\n    private float coverBitmapWidth;\n    /**\n     * 圆形遮盖的颜色\n     */\n    private int coverCirclrColor;\n    /**\n     * 圆形遮盖的半径\n     */\n    private float coverCirclrRadius;\n    /**\n     * 线框背景\n     */\n    private GradientDrawable gradientDrawable = new GradientDrawable();\n    private Bitmap coverBitmap;\n\n    private Paint mPaintCursor;\n\n    /**\n     * 光标\n     */\n    private GradientDrawable cursorDrawable = new GradientDrawable();\n    private int cursorColor;\n    private float cursorWidth;\n    private float cursorHeight;\n    private float cursorCornerRadius;\n    private boolean showCursor = false;\n    private boolean mCursorFlag;\n    private Blink mBlink;\n\n\n    public MNPasswordEditText(Context context) {\n        this(context, null);\n    }\n\n    public MNPasswordEditText(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public MNPasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        mContext = context;\n\n        //初始化参数\n        initAttrs(attrs, defStyleAttr);\n\n        //初始化相关\n        init();\n    }\n\n    private void initAttrs(AttributeSet attrs, int defStyleAttr) {\n        TypedArray array = mContext.obtainStyledAttributes(attrs, R.styleable.MNPasswordEditText, defStyleAttr, 0);\n\n        //背景色\n        backgroundColor = array.getColor(R.styleable.MNPasswordEditText_psw_background_color, Color.parseColor(\"#FFFFFF\"));\n        //边框颜色\n        borderColor = array.getColor(R.styleable.MNPasswordEditText_psw_border_color, Color.parseColor(defaultColor));\n        //边框选中的颜色\n        borderSelectedColor = array.getColor(R.styleable.MNPasswordEditText_psw_border_selected_color, Color.parseColor(defaultColor));\n        //文字的颜色\n        textColor = array.getColor(R.styleable.MNPasswordEditText_psw_text_color, Color.parseColor(defaultColor));\n        //边框圆角\n        borderRadius = array.getDimension(R.styleable.MNPasswordEditText_psw_border_radius, dip2px(6));\n        //边框线大小\n        borderWidth = array.getDimension(R.styleable.MNPasswordEditText_psw_border_width, dip2px(1));\n        //每个密码框的间隔\n        itemMargin = array.getDimension(R.styleable.MNPasswordEditText_psw_item_margin, dip2px(10));\n        //输入的模式\n        inputMode = array.getInt(R.styleable.MNPasswordEditText_psw_mode, 1);\n        //整体样式\n        editTextStyle = array.getInt(R.styleable.MNPasswordEditText_psw_style, 1);\n        //替换的图片\n        coverBitmapID = array.getResourceId(R.styleable.MNPasswordEditText_psw_cover_bitmap_id, -1);\n        //替换的文字\n        coverText = array.getString(R.styleable.MNPasswordEditText_psw_cover_text);\n        if (TextUtils.isEmpty(coverText)) {\n            coverText = \"密\";\n        }\n        //圆形的颜色\n        coverCirclrColor = array.getColor(R.styleable.MNPasswordEditText_psw_cover_circle_color, Color.parseColor(defaultColor));\n        //密码圆形遮盖半径\n        coverCirclrRadius = array.getDimension(R.styleable.MNPasswordEditText_psw_cover_circle_radius, 0);\n        //密码图片遮盖长宽\n        coverBitmapWidth = array.getDimension(R.styleable.MNPasswordEditText_psw_cover_bitmap_width, 0);\n\n        //--------------光标属性-----\n        showCursor = array.getBoolean(R.styleable.MNPasswordEditText_psw_show_cursor, false);\n        cursorColor = array.getColor(R.styleable.MNPasswordEditText_psw_cursor_color, borderSelectedColor);\n        cursorHeight = array.getDimension(R.styleable.MNPasswordEditText_psw_cursor_height, 0);\n        cursorWidth = array.getDimension(R.styleable.MNPasswordEditText_psw_cursor_width, 6);\n        cursorCornerRadius = array.getDimension(R.styleable.MNPasswordEditText_psw_cursor_corner_radius, 0);\n\n        //回收\n        array.recycle();\n    }\n\n    private void init() {\n        //最大的长度\n        maxLength = getMaxLength();\n        //隐藏光标\n        setCursorVisible(false);\n        //设置本来文字的颜色为透明\n        setTextColor(Color.TRANSPARENT);\n        //触摸获取焦点\n        setFocusableInTouchMode(true);\n        //屏蔽长按\n        setOnLongClickListener(new OnLongClickListener() {\n            @Override\n            public boolean onLongClick(View view) {\n                return true;\n            }\n        });\n\n        //初始化画笔\n        //文字\n        mPaintText = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mPaintText.setStyle(Paint.Style.FILL);\n        mPaintText.setColor(textColor);\n        mPaintText.setTextSize(getTextSize());\n\n        //线\n        mPaintLine = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mPaintLine.setStyle(Paint.Style.STROKE);\n        mPaintLine.setColor(borderColor);\n        mPaintLine.setStrokeWidth(borderWidth);\n\n        //光标\n        cursorDrawable.setCornerRadius(cursorCornerRadius);\n        cursorDrawable.setColor(cursorColor);\n        mPaintCursor = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mPaintCursor.setStyle(Paint.Style.FILL);\n        mPaintCursor.setColor(cursorColor);\n\n        //遮盖是图片方式，提前加载图片\n        if (inputMode == 2) {\n            //判断有没有图片\n            if (coverBitmapID == -1) {\n                //抛出异常\n                throw new NullPointerException(\"遮盖图片为空\");\n            } else {\n                coverBitmap = BitmapFactory.decodeResource(getContext().getResources(), coverBitmapID);\n            }\n        }\n    }\n\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        //获取宽高\n        int measuredWidth = getMeasuredWidth();\n        float itemH = getMeasuredHeight();\n        //方形框\n        float margin = itemMargin;\n        float itemW = (measuredWidth - margin * (maxLength - 1)) / maxLength;\n\n        int currentIndex = getText().length();\n\n        //判断类型\n        if (editTextStyle == 1) {\n            //连体框\n            gradientDrawable.setStroke((int) borderWidth, borderColor);\n            gradientDrawable.setCornerRadius(borderRadius);\n            gradientDrawable.setColor(backgroundColor);\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {\n                //Android系统大于等于API16，使用setBackground\n                setBackground(gradientDrawable);\n            } else {\n                //Android系统小于API16，使用setBackgroundDrawable\n                setBackgroundDrawable(gradientDrawable);\n            }\n            margin = 0;\n            itemW = measuredWidth / maxLength;\n            //画线\n            for (int i = 1; i < maxLength; i++) {\n                float startX = itemW * i;\n                float startY = 0;\n                float stopX = startX;\n                float stopY = itemH;\n                canvas.drawLine(startX, startY, stopX, stopY, mPaintLine);\n            }\n        } else if (editTextStyle == 2) {\n            gradientDrawable.setStroke((int) borderWidth, borderColor);\n            gradientDrawable.setCornerRadius(borderRadius);\n            gradientDrawable.setColor(backgroundColor);\n            Bitmap bitmap = drawableToBitmap(gradientDrawable, (int) itemW, (int) itemH);\n            Bitmap bitmapSelected = null;\n            if (borderSelectedColor != 0) {\n                gradientDrawable.setStroke((int) borderWidth, borderSelectedColor);\n                bitmapSelected = drawableToBitmap(gradientDrawable, (int) itemW, (int) itemH);\n            }\n            //画每个Item背景\n            for (int i = 0; i < maxLength; i++) {\n                float left = itemW * i + margin * i;\n                float top = 0;\n                if (bitmapSelected == null) {\n                    canvas.drawBitmap(bitmap, left, top, mPaintLine);\n                } else {\n                    if (currentIndex == i) {\n                        //选中是另外的颜色\n                        canvas.drawBitmap(bitmapSelected, left, top, mPaintLine);\n                    } else {\n                        canvas.drawBitmap(bitmap, left, top, mPaintLine);\n                    }\n                }\n            }\n        } else if (editTextStyle == 3) {\n            //下划线格式\n            for (int i = 0; i < maxLength; i++) {\n                if (borderSelectedColor != 0) {\n                    if (currentIndex == i) {\n                        //选中是另外的颜色\n                        mPaintLine.setColor(borderSelectedColor);\n                    } else {\n                        mPaintLine.setColor(borderColor);\n                    }\n                } else {\n                    mPaintLine.setColor(borderColor);\n                }\n                float startX = itemW * i + itemMargin * i;\n                float startY = itemH - borderWidth;\n                float stopX = startX + itemW;\n                float stopY = startY;\n                canvas.drawLine(startX, startY, stopX, stopY, mPaintLine);\n            }\n        }\n\n        //写文字\n        String currentText = getText().toString();\n        for (int i = 0; i < maxLength; i++) {\n            if (!TextUtils.isEmpty(currentText) && i < currentText.length()) {\n                //<!--密码框输入的模式:1.圆形，2.图片，3.文字，4.明文-->\n                if (inputMode == 1) {\n                    //圆点半径\n                    float circleRadius = itemW * 0.5f * 0.5f;\n                    if (circleRadius > itemH / 2f) {\n                        circleRadius = itemH * 0.5f * 0.5f;\n                    }\n                    if (coverCirclrRadius > 0) {\n                        circleRadius = coverCirclrRadius;\n                    }\n                    float startX = (itemW / 2f) + itemW * i + margin * i;\n                    float startY = (itemH) / 2.0f;\n                    mPaintText.setColor(coverCirclrColor);\n                    canvas.drawCircle(startX, startY, circleRadius, mPaintText);\n                } else if (inputMode == 2) {\n                    float picW = itemW * 0.5f;\n                    if (coverBitmapWidth > 0) {\n                        picW = coverBitmapWidth;\n                    }\n                    float startX = (itemW - picW) / 2f + itemW * i + margin * i;\n                    float startY = (itemH - picW) / 2f;\n                    Bitmap bitmap = Bitmap.createScaledBitmap(coverBitmap, (int) picW, (int) picW, true);\n                    canvas.drawBitmap(bitmap, startX, startY, mPaintText);\n                } else if (inputMode == 3) {\n                    float fontWidth = getFontWidth(mPaintText, coverText);\n                    float fontHeight = getFontHeight(mPaintText, coverText);\n                    float startX = (itemW - fontWidth) / 2f + itemW * i + margin * i;\n                    float startY = (itemH + fontHeight) / 2f - 6;\n                    mPaintText.setColor(textColor);\n                    canvas.drawText(coverText, startX, startY, mPaintText);\n                } else {\n                    String StrPosition = String.valueOf(currentText.charAt(i));\n                    float fontWidth = getFontWidth(mPaintText, StrPosition);\n                    float fontHeight = getFontHeight(mPaintText, StrPosition);\n                    float startX = (itemW - fontWidth) / 2f + itemW * i + margin * i;\n                    float startY = (itemH + fontHeight) / 2f;\n                    mPaintText.setColor(textColor);\n                    canvas.drawText(StrPosition, startX, startY, mPaintText);\n                }\n            }\n        }\n\n        if (showCursor && mCursorFlag) {\n            if (cursorHeight == 0 || cursorHeight > itemH) {\n                cursorHeight = itemH * 50 / 100;\n            }\n            Bitmap bitmap = drawableToBitmap(cursorDrawable, (int) cursorWidth, (int) cursorHeight);\n            float cursorLeft = (itemW + margin) * currentIndex + itemW / 2 - cursorWidth / 2;\n            float cursorTop = (itemH - cursorHeight) / 2;\n            canvas.drawBitmap(bitmap, cursorLeft, cursorTop, mPaintCursor);\n        }\n\n    }\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n        resumeBlink();\n    }\n\n    @Override\n    protected void onDetachedFromWindow() {\n        super.onDetachedFromWindow();\n        suspendBlink();\n    }\n\n    @Override\n    public void onWindowFocusChanged(boolean hasWindowFocus) {\n        super.onWindowFocusChanged(hasWindowFocus);\n        if (hasWindowFocus) {\n            if (mBlink != null) {\n                mBlink.uncancel();\n            }\n            makeBlink();\n        } else {\n            if (mBlink != null) {\n                mBlink.cancel();\n            }\n        }\n    }\n\n    @Override\n    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {\n        super.onFocusChanged(focused, direction, previouslyFocusedRect);\n        if (focused) {\n            if (mBlink != null) {\n                mBlink.uncancel();\n            }\n            makeBlink();\n        } else {\n            if (mBlink != null) {\n                mBlink.cancel();\n            }\n        }\n    }\n\n    private void resumeBlink() {\n        if (mBlink != null) {\n            mBlink.uncancel();\n        }\n        makeBlink();\n    }\n\n    private void suspendBlink() {\n        if (mBlink != null) {\n            mBlink.cancel();\n        }\n    }\n\n    private void makeBlink() {\n        if (true) {\n            if (mBlink == null) mBlink = new Blink();\n            removeCallbacks(mBlink);\n            postDelayed(mBlink, 500);\n        } else {\n            if (mBlink != null) removeCallbacks(mBlink);\n        }\n    }\n\n\n    private class Blink implements Runnable {\n\n        private boolean mCancelled = false;\n\n        @Override\n        public void run() {\n            mCursorFlag = !mCursorFlag;\n            invalidate();\n            if (mCancelled) {\n                return;\n            }\n            //每个500毫秒刷新一次\n            postDelayed(this, 500);\n        }\n\n        public void cancel() {\n            if (!mCancelled) {\n                removeCallbacks(this);\n                mCancelled = true;\n            }\n        }\n\n        public void uncancel() {\n            mCancelled = false;\n        }\n    }\n\n\n    public static Bitmap drawableToBitmap(Drawable drawable, int width, int height) {\n        Bitmap bitmap = Bitmap.createBitmap(\n                width,\n                height,\n                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);\n        Canvas canvas = new Canvas(bitmap);\n        drawable.setBounds(0, 0, width, height);\n        drawable.draw(canvas);\n        return bitmap;\n    }\n\n\n    @Override\n    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {\n        super.onTextChanged(text, start, lengthBefore, lengthAfter);\n        //刷新界面\n        invalidate();\n        if (onTextChangeListener != null) {\n            if (getText().toString().length() == getMaxLength()) {\n                onTextChangeListener.onTextChange(getText().toString(), true);\n            } else {\n                onTextChangeListener.onTextChange(getText().toString(), false);\n            }\n        }\n    }\n\n    public float getFontWidth(Paint paint, String str) {\n        Rect rect = new Rect();\n        paint.getTextBounds(str, 0, str.length(), rect);\n        return rect.width();\n    }\n\n    public float getFontHeight(Paint paint, String str) {\n        Rect rect = new Rect();\n        paint.getTextBounds(str, 0, str.length(), rect);\n        return rect.height();\n    }\n\n    public int getMaxLength() {\n        int length = 0;\n        try {\n            InputFilter[] inputFilters = getFilters();\n            for (InputFilter filter : inputFilters) {\n                Class<?> c = filter.getClass();\n                if (c.getName().equals(\"android.text.InputFilter$LengthFilter\")) {\n                    Field[] f = c.getDeclaredFields();\n                    for (Field field : f) {\n                        if (field.getName().equals(\"mMax\")) {\n                            field.setAccessible(true);\n                            length = (Integer) field.get(filter);\n                        }\n                    }\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return length;\n    }\n\n    private int dip2px(float dpValue) {\n        final float scale = getContext().getResources().getDisplayMetrics().density;\n        return (int) (dpValue * scale + 0.5f);\n    }\n\n    private OnTextChangeListener onTextChangeListener;\n\n    public void setOnTextChangeListener(OnTextChangeListener onTextChangeListener) {\n        this.onTextChangeListener = onTextChangeListener;\n    }\n\n    public interface OnTextChangeListener {\n        /**\n         * 监听输入变化\n         *\n         * @param text       当前的文案\n         * @param isComplete 是不是完成输入\n         */\n        void onTextChange(String text, boolean isComplete);\n    }\n\n}\n"
  },
  {
    "path": "pswedittextlibrary/src/main/res/values/attr.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <declare-styleable name=\"MNPasswordEditText\">\n        <!--密码框的颜色-->\n        <attr name=\"psw_border_color\" format=\"color\" />\n        <!--密码框选中的颜色-->\n        <attr name=\"psw_border_selected_color\" format=\"color\" />\n        <!--密码文字的颜色,圆形密码颜色-->\n        <attr name=\"psw_text_color\" format=\"color\" />\n        <!--密码框的圆角-->\n        <attr name=\"psw_border_radius\" format=\"dimension\" />\n        <!--密码框的线的大小-->\n        <attr name=\"psw_border_width\" format=\"dimension\" />\n        <!--密码框的每个间隔,只有样式2才起作用-->\n        <attr name=\"psw_item_margin\" format=\"dimension\" />\n        <!--密码框背景色-->\n        <attr name=\"psw_background_color\" format=\"color\" />\n        <!--密码框输入的模式:4.明文,3.文字,2.图片,1.圆形-->\n        <attr name=\"psw_mode\" format=\"enum\">\n            <!--圆形默认-->\n            <enum name=\"Circle\" value=\"1\" />\n            <!--图片-->\n            <enum name=\"Bitmap\" value=\"2\" />\n            <!--文本-->\n            <enum name=\"Text\" value=\"3\" />\n            <!--原始-->\n            <enum name=\"OriginalText\" value=\"4\" />\n        </attr>\n        <!--密码框样式: 1.连在一起 2.分开单独显示  3.下划线形式-->\n        <attr name=\"psw_style\" format=\"enum\">\n            <!--连在一起-->\n            <enum name=\"StyleDefault\" value=\"1\" />\n            <!--单独-->\n            <enum name=\"StyleOneself\" value=\"2\" />\n            <!--下划线形式-->\n            <enum name=\"StyleUnderLine\" value=\"3\" />\n        </attr>\n        <!--密码文字遮盖-->\n        <attr name=\"psw_cover_text\" format=\"string\" />\n        <!--密码图片遮盖-->\n        <attr name=\"psw_cover_bitmap_id\" format=\"reference\" />\n        <!--密码圆形遮盖颜色-->\n        <attr name=\"psw_cover_circle_color\" format=\"color\" />\n        <!--密码圆形遮盖半径-->\n        <attr name=\"psw_cover_circle_radius\" format=\"dimension\" />\n        <!--密码图片遮盖长宽-->\n        <attr name=\"psw_cover_bitmap_width\" format=\"dimension\" />\n        <!--是否显示光标-->\n        <attr name=\"psw_show_cursor\" format=\"boolean\" />\n        <!--光标颜色-->\n        <attr name=\"psw_cursor_color\" format=\"color\" />\n        <!--光标高度-->\n        <attr name=\"psw_cursor_height\" format=\"dimension\" />\n        <!--光标宽度-->\n        <attr name=\"psw_cursor_width\" format=\"dimension\" />\n        <!--光标圆角-->\n        <attr name=\"psw_cursor_corner_radius\" format=\"dimension\" />\n\n    </declare-styleable>\n\n</resources>"
  },
  {
    "path": "pswedittextlibrary/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">PswEditTextLibrary</string>\n</resources>\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':pswedittextlibrary'\n"
  }
]