[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.idea\n"
  },
  {
    "path": "README.md",
    "content": "# SmartisanTime\n仿锤子时间View\n\n最近看了[大神Sloop关于自定义view笔记](https://github.com/GcsSloop/AndroidNote)\n语言易懂很适合对自定义View不懂的人 。为了看自己学的怎么样，作为一个锤粉对于锤子的UI动画佩服，所以模仿了锤子手机时间控件。不才，精髓没有模仿到，O(∩_∩)O。\n\n\\(^o^)/~\n\n直接上效果图：\n\n![image](./images/smartisanTime.gif)\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 23\n    buildToolsVersion \"24.0.2\"\n\n    defaultConfig {\n        applicationId \"com.yolocc.smartisantime\"\n        minSdkVersion 14\n        targetSdkVersion 23\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    testCompile 'junit:junit:4.12'\n    compile 'com.android.support:appcompat-v7:23.4.0'\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/yolocc/Library/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/androidTest/java/com/yolocc/smartisantime/ApplicationTest.java",
    "content": "package com.yolocc.smartisantime;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.yolocc.smartisantime\"\n          xmlns:android=\"http://schemas.android.com/apk/res/android\">\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:hardwareAccelerated=\"false\"\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/yolocc/smartisantime/MainActivity.java",
    "content": "package com.yolocc.smartisantime;\n\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\n\npublic class MainActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/yolocc/smartisantime/SmartisanTime.java",
    "content": "package com.yolocc.smartisantime;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\nimport android.support.annotation.ColorInt;\nimport android.util.AttributeSet;\nimport android.util.TypedValue;\nimport android.view.View;\n\nimport java.util.Calendar;\n\n/**\n */\npublic class SmartisanTime extends View {\n\n    //表盘的背景颜色\n    @ColorInt\n    private static final int DIAL_BG = 0xFFF0F0F0;\n    //表外圆环的颜色\n    @ColorInt\n    private static final int RING_BG = 0xFFF8F8F8;\n    //字体颜色\n    @ColorInt\n    private static final int TEXT_COLOR = 0xFF141414;\n    //时针和分针的颜色\n    @ColorInt\n    private static final int HOUR_MINUTE_COLOR = 0xFF5B5B5B;\n    //秒钟的颜色\n    @ColorInt\n    private static final int SECOND_COLOR = 0xFFB55050;\n    //表盘最小大小\n    private static final int MIN_SIZE = 200;\n\n    private static final int HOUR_MINUTE_WIDTH = 30;\n\n    private static final int SECOND_WIDTH = 8;\n\n    //每秒 秒针移动6°\n    private static final int DEGREE = 6;\n\n    private int hour, minute, second;\n\n    //圆环的宽度\n    private int ringPaintWidth = 10;\n    //表盘的大小\n    private int mSize;\n    //表盘背景画笔\n    private Paint outCirclePaint;\n    //最外层圆环\n    private Paint outRingPaint;\n    //时间文本\n    private Paint timeTextPaint;\n    //时针,分针,秒针\n    private Paint hourPaint, minutePaint, secondPaint;\n    //中心圆\n    private Paint inCirclePaint, inRedCirclePaint;\n\n    //为了显示秒针晃动效果,需要重复绘制\n    private boolean isFirst = true;\n\n    /**\n     * 日历类，用来获取当前时间\n     */\n    private Calendar calendar;\n\n    public SmartisanTime(Context context) {\n        super(context);\n        initPaint();\n    }\n\n    public SmartisanTime(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initPaint();\n    }\n\n    public SmartisanTime(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        initPaint();\n    }\n\n    /**\n     * 初始化画笔\n     */\n    private void initPaint() {\n        //获取当前时间的实例\n        calendar = Calendar.getInstance();\n\n        outCirclePaint = new Paint();\n        outCirclePaint.setColor(DIAL_BG);\n        outCirclePaint.setAntiAlias(true);\n\n        outRingPaint = new Paint();\n        outRingPaint.setColor(RING_BG);\n        outRingPaint.setStrokeWidth(dp2px(ringPaintWidth));\n        outRingPaint.setStyle(Paint.Style.STROKE);\n        outRingPaint.setAntiAlias(true);\n        //        添加阴影 0x80000000\n        outRingPaint.setShadowLayer(4, 2, 2, 0x80000000);\n\n        timeTextPaint = new Paint();\n        timeTextPaint.setAntiAlias(true);\n        timeTextPaint.setColor(TEXT_COLOR);\n\n        hourPaint = new Paint();\n        hourPaint.setAntiAlias(true);\n        hourPaint.setColor(HOUR_MINUTE_COLOR);\n        hourPaint.setStrokeWidth(HOUR_MINUTE_WIDTH);\n        //设置为圆角\n        hourPaint.setStrokeCap(Paint.Cap.ROUND);\n        //        添加阴影\n        hourPaint.setShadowLayer(4, 0, 0, 0x80000000);\n\n        minutePaint = new Paint();\n        minutePaint.setAntiAlias(true);\n        minutePaint.setColor(HOUR_MINUTE_COLOR);\n        minutePaint.setStrokeWidth(HOUR_MINUTE_WIDTH);\n        //设置为圆角\n        minutePaint.setStrokeCap(Paint.Cap.ROUND);\n        //        添加阴影\n        minutePaint.setShadowLayer(4, 0, 0, 0x80000000);\n\n        secondPaint = new Paint();\n        secondPaint.setAntiAlias(true);\n        secondPaint.setColor(SECOND_COLOR);\n        secondPaint.setStrokeWidth(SECOND_WIDTH);\n        //设置为圆角\n        secondPaint.setStrokeCap(Paint.Cap.ROUND);\n        //        添加阴影\n        secondPaint.setShadowLayer(4, 3, 0, 0x80000000);\n\n        inCirclePaint = new Paint();\n        inCirclePaint.setAntiAlias(true);\n        inCirclePaint.setColor(HOUR_MINUTE_COLOR);\n        //        添加阴影\n        inCirclePaint.setShadowLayer(5, 0, 0, 0x80000000);\n\n        inRedCirclePaint = new Paint();\n        inRedCirclePaint.setAntiAlias(true);\n        inRedCirclePaint.setColor(SECOND_COLOR);\n        //        添加阴影\n        inRedCirclePaint.setShadowLayer(5, 0, 0, 0x80000000);\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n//        int width = startMeasure(widthMeasureSpec);\n//        int height = startMeasure(heightMeasureSpec);\n        mSize = dp2px(MIN_SIZE);\n        setMeasuredDimension(mSize, mSize);\n    }\n\n    /**\n     * 根据不同的模式,设置控件的大小;\n     *\n     * @param whSpec\n     * @return 最后控件的大小\n     */\n    private int startMeasure(int whSpec) {\n        int result;\n        int size = MeasureSpec.getSize(whSpec);\n        int mode = MeasureSpec.getMode(whSpec);\n        if (mode == MeasureSpec.EXACTLY || mode == MeasureSpec.AT_MOST) {\n            if (size < dp2px(MIN_SIZE)) {\n                result = dp2px(MIN_SIZE);\n            } else {\n                result = size;\n            }\n        } else {\n            result = dp2px(MIN_SIZE);\n        }\n        return result;\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        if (isFirst) {\n            calendar = Calendar.getInstance();\n        }\n        getTime();\n        //将画布移到中央\n        canvas.translate(mSize / 2, mSize / 2);\n\n        drawOutCircle(canvas);\n\n        drawOutRing(canvas);\n\n        drawScale(canvas);\n\n        drawHour(canvas);\n\n        drawMinute(canvas);\n\n        drawInCircle(canvas);\n        if (isFirst) {\n            drawSecond(canvas, second * DEGREE + 1);\n        } else {\n            drawSecond(canvas, second * DEGREE);\n        }\n\n        drawInRedCircle(canvas);\n\n        if (isFirst) {\n            //每隔1秒重绘View,重绘会调用onDraw()方法\n            postInvalidateDelayed(1000);\n        }\n    }\n\n    /**\n     * 获取时分秒\n     */\n    private void getTime() {\n        hour = calendar.get(Calendar.HOUR);\n        minute = calendar.get(Calendar.MINUTE);\n        second = calendar.get(Calendar.SECOND);\n        System.out.println(hour + \":\" + minute + \":\" + second);\n    }\n\n    /**\n     * 画表盘背景\n     *\n     * @param canvas 画布\n     */\n    private void drawOutCircle(Canvas canvas) {\n        canvas.drawCircle(0, 0, mSize / 2 - 4, outCirclePaint);\n        canvas.save();\n    }\n\n\n    /**\n     * 画表盘最外层圆环\n     *\n     * @param canvas 画布\n     */\n    private void drawOutRing(Canvas canvas) {\n        canvas.save();\n        float radius = mSize / 2 - dp2px(ringPaintWidth + 6) / 2;\n        RectF rectF = new RectF(-radius, -radius, radius, radius);\n        outRingPaint.setStrokeCap(Paint.Cap.ROUND);\n        canvas.drawArc(rectF, 0, 360, false, outRingPaint);\n\n        canvas.restore();\n    }\n\n\n    /**\n     * 画时间标志\n     *\n     * @param canvas 画布\n     */\n    private void drawScale(Canvas canvas) {\n        int radius = mSize / 2 - dp2px(ringPaintWidth) / 2;\n        // 刻度弧紧靠进度弧\n        canvas.save();\n        int textSize = 15;\n        timeTextPaint.setTextSize(sp2px(textSize));\n        float scaleWidth = timeTextPaint.measureText(\"12\");\n        canvas.drawText(\"12\", -scaleWidth / 2, -radius + 30 + dp2px(textSize), timeTextPaint);\n        scaleWidth = timeTextPaint.measureText(\"3\");\n        canvas.drawText(\"3\", radius - 30 - dp2px(textSize), scaleWidth / 2, timeTextPaint);\n        canvas.restore();\n    }\n\n    /**\n     * 画时针\n     *\n     * @param canvas 画布\n     */\n    private void drawHour(Canvas canvas) {\n        int length = mSize / 4;\n        canvas.save();\n        //这里没有算秒钟对时钟的影响\n        float degree = hour * 5 * DEGREE + minute / 2f;\n        canvas.rotate(degree, 0, 0);\n        canvas.drawLine(0, 0, 0, -length, hourPaint);\n        canvas.restore();\n    }\n\n    /**\n     * 画分针\n     *\n     * @param canvas 画布\n     */\n    private void drawMinute(Canvas canvas) {\n        int length = mSize / 3;\n        canvas.save();\n        float degree = minute * DEGREE + second / 10f;\n        canvas.rotate(degree, 0, 0);\n        canvas.drawLine(0, 0, 0, -length, minutePaint);\n        canvas.restore();\n    }\n\n    /**\n     * 画中心黑圆\n     *\n     * @param canvas 画布\n     */\n    private void drawInCircle(Canvas canvas) {\n        int radius = mSize / 20;\n        canvas.save();\n        canvas.drawCircle(0, 0, radius, inCirclePaint);\n        canvas.restore();\n    }\n\n    /**\n     * 红色中心圆\n     *\n     * @param canvas 画布\n     */\n    private void drawInRedCircle(Canvas canvas) {\n        int radius = mSize / 40;\n        canvas.save();\n        canvas.drawCircle(0, 0, radius, inRedCirclePaint);\n        canvas.restore();\n    }\n\n    /**\n     * 画秒针\n     *\n     * @param canvas 画布\n     */\n    private void drawSecond(Canvas canvas, float degrees) {\n        int length = mSize / 2;\n        canvas.save();\n        canvas.rotate(degrees);\n        canvas.drawLine(0, length / 5, 0, -length * 4 / 5, secondPaint);\n        canvas.restore();\n        isFirst = !isFirst;\n        if (!isFirst) {\n            invalidate();\n        }\n    }\n\n    /**\n     * 将 dp 转换为 px\n     *\n     * @param dp 需转换数\n     * @return 返回转换结果\n     */\n    private int dp2px(int dp) {\n        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());\n    }\n\n    private int sp2px(int sp) {\n        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    tools:context=\"com.yolocc.smartisantime.MainActivity\">\n\n    <com.yolocc.smartisantime.SmartisanTime\n        android:layout_width=\"300dp\"\n        android:layout_height=\"300dp\"\n        android:layout_centerInParent=\"true\"/>\n</RelativeLayout>\n"
  },
  {
    "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\">SmartisanTime</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": "app/src/test/java/com/yolocc/smartisantime/ExampleUnitTest.java",
    "content": "package com.yolocc.smartisantime;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * To work on unit tests, switch the Test Artifact in the Build Variants view.\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\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        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.1.3'\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        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Tue Sep 13 10:34:28 CST 2016\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.14.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.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\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"
  },
  {
    "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": "settings.gradle",
    "content": "include ':app'\n"
  }
]