[
  {
    "path": ".gitignore",
    "content": "# new gitignore for android studio projects\n#built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\ngen/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Windows thumbnail db\nThumbs.db\n\n# OSX files\n.DS_Store\n\n# Eclipse project files\n.classpath\n.project\n\n# Android Studio\n.idea\n.gradle\nbuild\n*/build\n*.iml\n"
  },
  {
    "path": "README.md",
    "content": "Skycons for Android [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-Skycons-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/1043)\n===================\n\n<p align=\"center\">\n  <img src=\"https://github.com/torryharris/Skycons/blob/master/Skycons/skycons.gif\" alt=\"Skycons\"/>\n</p>\n\nWe set out to create a native weather app on Xamarin but we wanted to build something unique to differentiate ourselves amongst the plethora of weather apps avaialble out there. The [DarkSky](http://darkskyapp.com) app & [Forecast](http://forecast.io) did an excellent job with their [Skycons](http://darkskyapp.github.io/skycons/). \n\nWe wanted to re-use the same icons for our app as well, however, we found that these animated icons don't exist natively on either platforms. This is currently a work-in-progress as the team is finetuning the animation & the performance itself. You can download the complete repository which also contains the sample project SkyconsDemo.\n\n*Built with Android Studio (2.2.3)*\n\n## Available Icons\n\n| Icon | View |\n| :------: | :---: |\n| Cloud | CloudView |\n| Clear Sky (Sunny) | SunView |\n| Clear Night | MoonView |\n| Partly Cloudy Day | CloudSunView |\n| Partly Cloudy Night | CloudMoonView |\n| Heavy Showers | CloudHvRainView |\n| Snow | CloudSnowView |\n| Light Showers | CloudRainView |\n| Fog | CloudFogView |\n| Wind | WindView |\n| Thunder | CloudThunderView |\n\n## How to use\n - Deployment target should be API level 14 or above.\n - Import 'SkyconsLibrary' as a library to your project.\n\n\n## Adding icons:\n\n    1) To add a skycon(icon) through the XML:\n                     \n           <com.thbs.skycons.library.<skycon>\n             android:layout_width=\"250dp\"\n             android:layout_height=\"250dp\"\n             android:layout_centerHorizontal=\"true\"\n             android:layout_centerVertical=\"true\"\n             app:isStatic = \"true\"\n             app:strokeColor = \"#000000\"\n             app:bgColor = \"#ffffff\"/>\n\n    where <skycon> represents the particular view/icon. For example \"MoonView\"\n    \n    \n    2) To add a skycon(For instance, WindView) through Java code, perform following in the activity:\n    \n          \n            LinearLayout layout = new LinearLayout(this);\n            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(\n                LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);\n            layout.setLayoutParams(params);\n        \n            //Using these params, you can control view attributes\n            //attributres include boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor\n            WindView windView = new WindView(this,true,false, Color.parseColor(\"#000000\"),Color.parseColor(\"#ffffff\"));          \n            \n            //Using these params, you can control width & height of the icon\n            params.width = 200;\n            params.height = 200;\n            windView.setLayoutParams(params);\n          \n            layout.addView(windView);\n            this.setContentView(layout);\n          \n          \n\n -  For a better experience, keep 'layout_width' & 'layout_height' the same.\n \n## Customization:\n\n| Options | Value | Description |\n| :------: | :---: | :----------: |\n| layout_width | 100dp (recommended min value) | Width of icon |\n| layout_height | 100dp (recommended min value) | Height of the icon |\n| isStatic | True / False | Boolean Value to enable on-touch animation |\n| strokeColor | HEX | Customize the color of the icon |\n| bgColor | HEX | Customize the background colour |\n\n\n\n<B>Pull Requests</B> are welcomed. We are looking forward for your suggestions on new icons & animations.\n\n\n\n##Demo\n<a href=\"https://play.google.com/store/apps/details?id=com.thbs.skycons\">\n  <img alt=\"Get it on Google Play\"\n       src=\"https://developer.android.com/images/brand/en_generic_rgb_wo_60.png\" />\n</a>\n\n\nLicense\n=======\n\nSkycons for Android is being made available in public domain under similar terms like the [original](https://github.com/darkskyapp/skycons)\n"
  },
  {
    "path": "Skycons/.gitignore",
    "content": "# new gitignore for android studio projects\n#built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\ngen/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Windows thumbnail db\nThumbs.db\n\n# OSX files\n.DS_Store\n\n# Eclipse project files\n.classpath\n.project\n\n# Android Studio\n.idea\n.gradle\nbuild\n*/build\n*.iml\n\n"
  },
  {
    "path": "Skycons/SkyconDemo/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "Skycons/SkyconDemo/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion '25.0.3'\n\n    defaultConfig {\n        applicationId \"com.thbs.skycons\"\n        minSdkVersion 14\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    compile project(':SkyconsLibrary')\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/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 /Applications/Android Studio.app/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": "Skycons/SkyconDemo/src/androidTest/java/thbs/com/skycons/ApplicationTest.java",
    "content": "package thbs.com.skycons;\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": "Skycons/SkyconDemo/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.thbs.skycons\" >\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\" >\n\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\" >\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\n        <activity\n            android:name=\".ViewAllActivity\"\n            android:label=\"All Views\" >\n        </activity>\n\n        <activity\n            android:name=\".SunActivity\"\n            android:label=\"Sun\" >\n        </activity>\n\n        <activity\n            android:name=\".CloudSunActivity\"\n            android:label=\"Sun+Cloud\" >\n        </activity>\n\n        <activity\n            android:name=\".CloudActivity\"\n            android:label=\"Cloud\" >\n        </activity>\n\n        <activity\n            android:name=\".CloudRainActivity\"\n            android:label=\"Cloud+Rain\" >\n\n        </activity>\n\n        <activity\n            android:name=\".CloudHvRainActivity\"\n            android:label=\"Cloud+Rain\" >\n        </activity>\n\n        <activity\n            android:name=\".CloudSnowActivity\"\n            android:label=\"Cloud+Snow\" >\n        </activity>\n\n        <activity\n            android:name=\".CloudFogActivity\"\n            android:label=\"Cloud+Fog\" >\n        </activity>\n\n        <activity\n            android:name=\".MoonActivity\"\n            android:label=\"Moon\" >\n        </activity>\n\n        <activity\n            android:name=\".CloudMoonActivity\"\n            android:label=\"Cloud+Moon\" >\n        </activity>\n\n        <activity\n            android:name=\".WindActivity\"\n            android:label=\"Wind\" >\n        </activity>\n\n        <activity\n            android:name=\".ThunderActivity\"\n            android:label=\"Thunder\" >\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/CloudActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 10/09/14.\n */\npublic class CloudActivity extends Activity {\n\n    @Override\n\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.cloud);\n    }\n\n}\n\n\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/CloudFogActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 10/09/14.\n */\npublic class CloudFogActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.cloud_fog);\n    }\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/CloudHvRainActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 10/09/14.\n */\npublic class CloudHvRainActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.cloud_hvrain);\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/CloudMoonActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 11/09/14.\n */\npublic class CloudMoonActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.cloud_moon);\n    }\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/CloudRainActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 10/09/14.\n */\npublic class CloudRainActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.cloud_rain);\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/CloudSnowActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n\n/**\n * Created by administrator on 10/09/14.\n */\npublic class CloudSnowActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.cloud_snow);\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/CloudSunActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class CloudSunActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.cloud_sun);\n    }\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/MainActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.Button;\n\n\npublic class MainActivity extends Activity {\n\n    Button btnViewAll, btnSun, btnCloudSun,btnCloud, btnCloudRain, btnCloudHvRain, btnCloudSnow,\n           btnCloudFog, btnMoon, btnCloudMoon, btnWind, btnThunder;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        btnViewAll = (Button) findViewById(R.id.all);\n        btnSun = (Button) findViewById(R.id.sun);\n        btnCloudSun = (Button) findViewById(R.id.cloud_sun);\n        btnCloud = (Button) findViewById(R.id.cloud);\n        btnCloudRain = (Button) findViewById(R.id.cloud_rain);\n        btnCloudHvRain = (Button) findViewById(R.id.cloud_hvrain);\n        btnCloudSnow = (Button) findViewById(R.id.cloud_snow);\n        btnCloudFog = (Button) findViewById(R.id.cloud_fog);\n        btnMoon = (Button) findViewById(R.id.moon);\n        btnCloudMoon = (Button) findViewById(R.id.cloud_moon);\n        btnWind = (Button) findViewById(R.id.wind);\n        btnThunder = (Button) findViewById(R.id.thunder);\n\n        btnViewAll.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, ViewAllActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnSun.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, SunActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnCloudSun.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, CloudSunActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnCloud.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, CloudActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnCloudRain.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, CloudRainActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnCloudHvRain.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, CloudHvRainActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnCloudSnow.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, CloudSnowActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnCloudFog.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, CloudFogActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnMoon.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, MoonActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnCloudMoon.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, CloudMoonActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnWind.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, WindActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n        btnThunder.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Intent i = new Intent(MainActivity.this, ThunderActivity.class);\n                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                startActivity(i);\n            }\n        });\n\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/MoonActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 11/09/14.\n */\npublic class MoonActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.moon);\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/SunActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n <<<<<<< HEAD\n * Created by administrator on 29/09/14.\n =======\n * Created by administrator on 9/29/14.\n >>>>>>> 31ecf11b87fdd0f58ca31eb3b2754003debca09f\n */\npublic class SunActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.sun);\n    }\n}"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/ThunderActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by admin on 10/1/14.\n */\npublic class ThunderActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.thunder);\n    }\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/ViewAllActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 30/09/14.\n */\npublic class ViewAllActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.all_views);\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/java/com/thbs/skycons/WindActivity.java",
    "content": "package com.thbs.skycons;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Created by administrator on 15/09/14.\n */\npublic class WindActivity extends Activity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.wind);\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/activity_main.xml",
    "content": "<ScrollView 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:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    tools:context=\".MainActivity\">\n\n    <RelativeLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\">\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"View All\"\n            android:id=\"@+id/all\"\n            android:layout_marginLeft=\"10dp\"\n           />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Sun\"\n            android:id=\"@+id/sun\"\n            android:layout_below=\"@+id/all\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginLeft=\"10dp\"\n            />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Moon\"\n            android:id=\"@+id/moon\"\n            android:layout_below=\"@+id/sun\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginLeft=\"10dp\"\n           />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Cloud+Sun\"\n            android:id=\"@+id/cloud_sun\"\n            android:layout_below=\"@+id/moon\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginLeft=\"10dp\"\n            />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Cloud+Moon\"\n            android:id=\"@+id/cloud_moon\"\n            android:layout_below=\"@+id/cloud_sun\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginLeft=\"10dp\"\n            />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Cloud\"\n            android:id=\"@+id/cloud\"\n            android:layout_below=\"@+id/cloud_moon\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginLeft=\"10dp\"\n             />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Cloud+Rain\"\n            android:id=\"@+id/cloud_rain\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_below=\"@+id/cloud\"\n            android:layout_marginLeft=\"10dp\"\n            />\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Cloud+HvRain\"\n            android:id=\"@+id/cloud_hvrain\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_below=\"@+id/cloud_rain\"\n            android:layout_marginLeft=\"10dp\"\n             />\n\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:text=\"Cloud+Snow\"\n            android:id=\"@+id/cloud_snow\"\n            android:layout_below=\"@+id/cloud_hvrain\"\n            android:layout_marginLeft=\"10dp\"\n             />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Wind\"\n            android:id=\"@+id/wind\"\n            android:layout_below=\"@+id/cloud_snow\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginTop=\"10dp\" />\n\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/wind\"\n            android:text=\"Cloud+Fog\"\n            android:id=\"@+id/cloud_fog\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginTop=\"10dp\" />\n\n        <Button\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/cloud_fog\"\n            android:text=\"Thunder\"\n            android:id=\"@+id/thunder\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginTop=\"10dp\" />\n\n\n    </RelativeLayout>\n</ScrollView>\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/all_views.xml",
    "content": "<ScrollView 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:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:background=\"#ffffff\"\n    tools:context=\".MainActivity\">\n\n    <RelativeLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:layout_height=\"wrap_content\">\n\n        <com.thbs.skycons.library.SunView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:layout_marginTop=\"20dp\"\n            android:id=\"@+id/sun_view\"/>\n\n        <com.thbs.skycons.library.MoonView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:layout_marginTop=\"20dp\"\n            android:id=\"@+id/moon_view\"\n            android:layout_toRightOf=\"@+id/sun_view\"\n            android:layout_marginLeft=\"10dp\"/>\n\n        <com.thbs.skycons.library.CloudSunView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:layout_marginTop=\"20dp\"\n            android:id=\"@+id/cloud_sun_view\"\n            android:layout_toRightOf=\"@+id/moon_view\"/>\n\n        <com.thbs.skycons.library.CloudMoonView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/cloud_moon_view\"\n            android:layout_below=\"@+id/sun_view\"/>\n\n        <com.thbs.skycons.library.CloudView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/cloud_view\"\n            android:layout_below=\"@+id/sun_view\"\n            android:layout_toRightOf=\"@+id/cloud_moon_view\"/>\n\n        <com.thbs.skycons.library.CloudRainView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/cloud_rain_view\"\n            android:layout_below=\"@+id/sun_view\"\n            android:layout_toRightOf=\"@+id/cloud_view\"/>\n\n        <com.thbs.skycons.library.CloudHvRainView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/cloud_hvrain_view\"\n            android:layout_below=\"@+id/cloud_moon_view\"/>\n\n\n        <com.thbs.skycons.library.CloudSnowView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/cloud_snow_view\"\n            android:layout_toRightOf=\"@+id/cloud_hvrain_view\"\n            android:layout_below=\"@+id/cloud_moon_view\"/>\n\n        <com.thbs.skycons.library.WindView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/wind_view\"\n            android:layout_toRightOf=\"@+id/cloud_snow_view\"\n            android:layout_below=\"@+id/cloud_moon_view\" />\n\n\n        <com.thbs.skycons.library.CloudFogView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/cloud_fog_view\"\n            android:layout_below=\"@+id/cloud_hvrain_view\" />\n\n        <com.thbs.skycons.library.CloudThunderView\n            android:layout_width=\"100dp\"\n            android:layout_height=\"100dp\"\n            android:id=\"@+id/thunder_view\"\n            android:layout_toRightOf=\"@+id/cloud_fog_view\"\n            android:layout_below=\"@+id/cloud_hvrain_view\" />\n\n    </RelativeLayout>\n</ScrollView>\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/cloud.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n        <com.thbs.skycons.library.CloudView\n            android:layout_width=\"250dp\"\n            android:layout_height=\"250dp\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_centerVertical=\"true\"\n            app:isStatic = \"true\"\n            app:strokeColor = \"#000000\"\n            app:bgColor = \"#ffffff\"/>\n\n    </RelativeLayout>\n\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/cloud_fog.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.CloudFogView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/cloud_hvrain.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.CloudHvRainView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/cloud_moon.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.CloudMoonView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/cloud_rain.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.CloudRainView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/cloud_snow.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.CloudSnowView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/cloud_sun.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.CloudSunView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/moon.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.MoonView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/sun.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.SunView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/thunder.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.CloudThunderView\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"\n        />\n\n</RelativeLayout>\n\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/layout/wind.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.thbs.skycons.library.WindView\n\n        android:layout_width=\"250dp\"\n        android:layout_height=\"250dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        app:isStatic = \"true\"\n        app:strokeColor = \"#000000\"\n        app:bgColor = \"#ffffff\"/>\n\n\n</RelativeLayout>"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/menu/main.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\".MainActivity\" >\n    <item android:id=\"@+id/action_settings\"\n        android:title=\"@string/action_settings\"\n        android:orderInCategory=\"100\"\n        android:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "Skycons/SkyconDemo/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": "Skycons/SkyconDemo/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">Skycons</string>\n    <string name=\"hello_world\">Hello world!</string>\n    <string name=\"action_settings\">Settings</string>\n\n\n</resources>\n"
  },
  {
    "path": "Skycons/SkyconDemo/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "Skycons/SkyconDemo/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": "Skycons/SkyconsLibrary/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.3\"\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n\n}\n\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/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 /Applications/Android Studio.app/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": "Skycons/SkyconsLibrary/src/androidTest/java/com/thbs/skycons/library/ApplicationTest.java",
    "content": "package com.thbs.skycons.library;\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": "Skycons/SkyconsLibrary/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.thbs.skycons.library\" >\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\" >\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/Cloud.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.graphics.Path;\nimport android.graphics.PointF;\n\n/**\n * Created by administrator on 10/1/14.\n */\npublic class Cloud {\n\n    Path path;\n\n    public Path getCloud(float centerX, float centerY, int dimension, double count) {\n\n\n        //different radius values for the cloud coordinates\n\n        path = new Path();\n\n        int r1 = (int) (0.1875 * dimension);\n        int r2 = (int) (0.1041667 * dimension);\n        double offset = 0.00023125 * dimension;\n\n        // cloud coordinates from the center of the screen\n        float X1 = (float) (r1 * Math.cos(Math.toRadians(0 + (0.222 * count))) + centerX); //x value of coordinate 1 at radius r1 from center of Screen and angle incremented with counter\n        float Y1 = ((float) (r2 * Math.sin(Math.toRadians(0 + (0.222 * count))) + centerY));//y value of coordinate 1 at radius r2 from center of Screen and angle incremented with counter\n        float P1X = (float) (r1 * Math.cos(Math.toRadians(80 + (0.111 * count))) + centerX);//x value of coordinate 2 at radius r1 from center of Screen and angle incremented with counter\n        float P1Y = ((float) (r2 * Math.sin(Math.toRadians(80 + (0.111 * count))) + centerY));//y value of coordinate 2 at radius r2 from center of Screen and angle incremented with counter\n        float P2X = (float) (r1 * Math.cos(Math.toRadians(120 + (0.222 * count))) + centerX);//x value of coordinate 3 at radius r1 from center of Screen and angle incremented with counter\n        float P2Y = ((float) ((r2 + (offset * count)) * Math.sin(Math.toRadians(120 + (0.222 * count))) + centerY));//y value of coordinate 3 at varying radius from center of Screen and angle incremented with counter\n        float P3X = (float) (r1 * Math.cos(Math.toRadians(200 + (0.222 * count))) + centerX);//x value of coordinate 4 at radius r1 from center of Screen and angle incremented with counter\n        float P3Y = ((float) (r1 * Math.sin(Math.toRadians(200 + (0.222 * count))) + centerY));//y value of coordinate 4 at radius r1 from center of Screen and angle incremented with counter\n        float P4X = (float) (r1 * Math.cos(Math.toRadians(280 + (0.222 * count))) + centerX);//x value of coordinate 5 at radius r1 from center of Screen and angle incremented with counter\n        float P4Y = ((float) (r1 * Math.sin(Math.toRadians(280 + (0.222 * count))) + centerY));//y value of coordinate 5 at radius r1 from center of Screen and angle incremented with counter\n\n\n        path.moveTo(X1, Y1);\n\n        // getting points in between coordinates for drawing arc between them\n        PointF P1c1 = calculateTriangle(X1, Y1, P1X, P1Y, true);\n        PointF P1c2 = calculateTriangle(X1, Y1, P1X, P1Y, false);\n        PointF P2c1 = calculateTriangle(P1X, P1Y, P2X, P2Y, true);\n        PointF P2c2 = calculateTriangle(P1X, P1Y, P2X, P2Y, false);\n        PointF P3c1 = calculateTriangle(P2X, P2Y, P3X, P3Y, true);\n        PointF P3c2 = calculateTriangle(P2X, P2Y, P3X, P3Y, false);\n        PointF P4c1 = calculateTriangle(P3X, P3Y, P4X, P4Y, true);\n        PointF P4c2 = calculateTriangle(P3X, P3Y, P4X, P4Y, false);\n        PointF P5c1 = calculateTriangle(P4X, P4Y, X1, Y1, true);\n        PointF P5c2 = calculateTriangle(P4X, P4Y, X1, Y1, false);\n\n        // drawing arcs between coordinates\n        path.moveTo(X1, Y1);\n        path.cubicTo(P1c1.x, P1c1.y, P1c2.x, P1c2.y, P1X, P1Y);\n        path.cubicTo(P2c1.x, P2c1.y, P2c2.x, P2c2.y, P2X, P2Y);\n        path.cubicTo(P3c1.x, P3c1.y, P3c2.x, P3c2.y, P3X, P3Y);\n        path.cubicTo(P4c1.x, P4c1.y, P4c2.x, P4c2.y, P4X, P4Y);\n        path.cubicTo(P5c1.x, P5c1.y, P5c2.x, P5c2.y, X1, Y1);\n\n        return path;\n    }\n\n\n    private PointF calculateTriangle(float x1, float y1, float x2,\n                                     float y2, boolean left) {\n\n        PointF result = new PointF(0, 0);\n        // finding center point between the coordinates\n        float dy = y2 - y1;\n        float dx = x2 - x1;\n        float dangle = 0;\n        // calculating angle and the distance between center and the two points\n        if (left) {\n            dangle = (float) ((Math.atan2(dy, dx) - Math.PI / 3f));\n        } else {\n            dangle = (float) ((Math.atan2(dy, dx) - Math.PI / 1.5f));\n        }\n        float sideDist = (float) 0.45 * (float) Math.sqrt(dx * dx + dy * dy); //square\n\n        // sideDist = sideDist + sideDist/10;\n\n        if (left) {\n            //point from center to the left\n            result.x = (int) (Math.cos(dangle) * sideDist + x1);\n            result.y = (int) (Math.sin(dangle) * sideDist + y1);\n\n        } else {\n            //point from center to the right\n            result.x = (int) (Math.cos(dangle) * sideDist + x2);\n            result.y = (int) (Math.sin(dangle) * sideDist + y2);\n        }\n\n        return result;\n\n    }\n\n\n   public PointF getP1c1(float centerX, float centerY, int dimension, double count){\n       int r1 = (int) (0.1875 * dimension);\n       int r2 = (int) (0.1041667 * dimension);\n       double offset = 0.00023125 * dimension;\n\n       // cloud coordinates from the center of the screen\n       float X1 = (float) (r1 * Math.cos(Math.toRadians(0 + (0.222 * count))) + centerX); //x value of coordinate 1 at radius r1 from center of Screen and angle incremented with counter\n       float Y1 = ((float) (r2 * Math.sin(Math.toRadians(0 + (0.222 * count))) + centerY));//y value of coordinate 1 at radius r2 from center of Screen and angle incremented with counter\n       float P1X = (float) (r1 * Math.cos(Math.toRadians(80 + (0.111 * count))) + centerX);//x value of coordinate 2 at radius r1 from center of Screen and angle incremented with counter\n       float P1Y = ((float) (r2 * Math.sin(Math.toRadians(80 + (0.111 * count))) + centerY));//y value of coordinate 2 at radius r2 from center of Screen and angle incremented with counter\n\n       // getting points in between coordinates for drawing arc between them\n       PointF P1c1 = calculateTriangle(X1, Y1, P1X, P1Y, true);\n\n       return P1c1;\n   }\n\n    public PointF getP1c2(float centerX, float centerY, int dimension, double count){\n        int r1 = (int) (0.1875 * dimension);\n        int r2 = (int) (0.1041667 * dimension);\n        double offset = 0.00023125 * dimension;\n\n        // cloud coordinates from the center of the screen\n        float X1 = (float) (r1 * Math.cos(Math.toRadians(0 + (0.222 * count))) + centerX); //x value of coordinate 1 at radius r1 from center of Screen and angle incremented with counter\n        float Y1 = ((float) (r2 * Math.sin(Math.toRadians(0 + (0.222 * count))) + centerY));//y value of coordinate 1 at radius r2 from center of Screen and angle incremented with counter\n        float P1X = (float) (r1 * Math.cos(Math.toRadians(80 + (0.111 * count))) + centerX);//x value of coordinate 2 at radius r1 from center of Screen and angle incremented with counter\n        float P1Y = ((float) (r2 * Math.sin(Math.toRadians(80 + (0.111 * count))) + centerY));//y value of coordinate 2 at radius r2 from center of Screen and angle incremented with counter\n\n        PointF P1c2 = calculateTriangle(X1, Y1, P1X, P1Y, false);\n\n        return P1c2;\n    }\n\n\n    public PointF getP2c1(float centerX, float centerY, int dimension, double count){\n        int r1 = (int) (0.1875 * dimension);\n        int r2 = (int) (0.1041667 * dimension);\n        double offset = 0.00023125 * dimension;\n\n        // cloud coordinates from the center of the screen\n        float P1X = (float) (r1 * Math.cos(Math.toRadians(80 + (0.111 * count))) + centerX);//x value of coordinate 2 at radius r1 from center of Screen and angle incremented with counter\n        float P1Y = ((float) (r2 * Math.sin(Math.toRadians(80 + (0.111 * count))) + centerY));//y value of coordinate 2 at radius r2 from center of Screen and angle incremented with counter\n        float P2X = (float) (r1 * Math.cos(Math.toRadians(120 + (0.222 * count))) + centerX);//x value of coordinate 3 at radius r1 from center of Screen and angle incremented with counter\n        float P2Y = ((float) ((r2 + (offset * count)) * Math.sin(Math.toRadians(120 + (0.222 * count))) + centerY));//y value of coordinate 3 at varying radius from center of Screen and angle incremented with counter\n\n        PointF P2c1 = calculateTriangle(P1X, P1Y, P2X, P2Y, true);\n\n        return P2c1;\n    }\n\n\n    public PointF getP2c2(float centerX, float centerY, int dimension, double count){\n        int r1 = (int) (0.1875 * dimension);\n        int r2 = (int) (0.1041667 * dimension);\n        double offset = 0.00023125 * dimension;\n\n        float P1X = (float) (r1 * Math.cos(Math.toRadians(80 + (0.111 * count))) + centerX);//x value of coordinate 2 at radius r1 from center of Screen and angle incremented with counter\n        float P1Y = ((float) (r2 * Math.sin(Math.toRadians(80 + (0.111 * count))) + centerY));//y value of coordinate 2 at radius r2 from center of Screen and angle incremented with counter\n        float P2X = (float) (r1 * Math.cos(Math.toRadians(120 + (0.222 * count))) + centerX);//x value of coordinate 3 at radius r1 from center of Screen and angle incremented with counter\n        float P2Y = ((float) ((r2 + (offset * count)) * Math.sin(Math.toRadians(120 + (0.222 * count))) + centerY));//y value of coordinate 3 at varying radius from center of Screen and angle incremented with counter\n\n        PointF P2c2 = calculateTriangle(P1X, P1Y, P2X, P2Y, false);\n\n        return P2c2;\n    }\n\n    public PointF getP5c1(float centerX, float centerY, int dimension, double count){\n        int r1 = (int) (0.1875 * dimension);\n        int r2 = (int) (0.1041667 * dimension);\n        double offset = 0.00023125 * dimension;\n\n        // cloud coordinates from the center of the screen\n        float X1 = (float) (r1 * Math.cos(Math.toRadians(0 + (0.222 * count))) + centerX); //x value of coordinate 1 at radius r1 from center of Screen and angle incremented with counter\n        float Y1 = ((float) (r2 * Math.sin(Math.toRadians(0 + (0.222 * count))) + centerY));//y value of coordinate 1 at radius r2 from center of Screen and angle incremented with counter\n        float P4X = (float) (r1 * Math.cos(Math.toRadians(280 + (0.222 * count))) + centerX);//x value of coordinate 5 at radius r1 from center of Screen and angle incremented with counter\n        float P4Y = ((float) (r1 * Math.sin(Math.toRadians(280 + (0.222 * count))) + centerY));//y value of coordinate 5 at radius r1 from center of Screen and angle incremented with counter\n\n        PointF P5c1 = calculateTriangle(P4X, P4Y, X1, Y1, true);\n\n        return P5c1;\n    }\n\n\n}"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudFogView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PointF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * Created by administrator on 12/09/14.\n */\npublic class CloudFogView extends SkyconView {\n\n    Paint paintCloud, paintFog;\n    boolean expanding = false;\n    boolean moving = true;\n\n    float ctr = 0;\n    float i,j;\n    private int screenW, screenH;\n    Boolean check;\n    private float X, Y;\n    private Path  path1, path2;\n    private double count;\n    Cloud cloud;\n    boolean compress = false;\n    float line1Y = 0, line2Y = 0,lineStartX, lineEndX;\n\n    public CloudFogView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public CloudFogView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n\n    private void init() {\n\n        count = 0;\n        i=0f;\n        j=(int)0.5;\n        check = false;\n\n        if(isStatic)\n        {\n            isAnimated = false;\n        }\n        else\n        {\n            isAnimated = true;\n        }\n        paintCloud = new Paint();\n        paintFog = new Paint();\n\n        //Setting paint for cloud\n        paintCloud.setColor(strokeColor);\n        paintCloud.setAntiAlias(true);\n        paintCloud.setStrokeCap(Paint.Cap.ROUND);\n        paintCloud.setStrokeJoin(Paint.Join.ROUND);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        paintCloud.setShadowLayer(0, 0, 0, Color.BLACK);\n\n        //Setting paint for fog\n        paintFog.setColor(strokeColor);\n        paintFog.setAntiAlias(true);\n        paintFog.setStrokeCap(Paint.Cap.ROUND);\n        paintFog.setStrokeJoin(Paint.Join.ROUND);\n        paintFog.setStyle(Paint.Style.FILL_AND_STROKE);\n        paintFog.setShadowLayer(0, 0, 0, Color.BLACK);\n\n        cloud = new Cloud();\n    }\n\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w;\n        screenH = h;\n\n        X = screenW/2;\n        Y = (screenH/2);\n\n\n    }\n\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        canvas.drawColor(bgColor);\n\n        paintCloud.setStrokeWidth((float)(0.02083*screenW));\n        paintFog.setStrokeWidth((float)(0.02083*screenW));\n\n        path1 = new Path();\n        path2 = new Path();\n\n        count = count+0.5;\n\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n            count = 0;\n        }\n\n\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n        PointF P1c2 = cloud.getP1c2(X,Y,screenW,count);\n\n        path1 = new Path();\n        path2 = new Path();\n\n        if(line1Y == 0) {\n            line1Y = P1c2.y + (float)(0.1042 * screenW);   //Calculating Y coordinate for foglines.\n            line2Y = P1c2.y + (float)(0.15625 * screenW);\n\n            lineStartX = (float)(X-X*50.0/100.0);  //Calculating X coordinate for foglines.\n            lineEndX = (float) (X+X*50.0/100);\n        }\n\n\n        float temp = (lineEndX-lineStartX)*(float)95.0/(float)100; //Calculating fogline length\n\n        path1.moveTo(lineStartX, line1Y);\n        path1.lineTo(lineStartX + temp, line1Y);\n\n        path2.moveTo(lineEndX, line2Y);\n        path2.lineTo(lineEndX-temp,line2Y);\n\n        //Code to move foglines from one point to another\n\n        if(moving&&(lineStartX+temp+ctr)<=lineEndX) {\n\n            path1.reset();\n            path1.moveTo(lineStartX+ctr+i,line1Y);\n            path1.lineTo(lineStartX+ctr+temp+i,line1Y);\n\n            path2.reset();\n            path2.moveTo(lineEndX-ctr+i+i,line2Y);\n            path2.lineTo(lineEndX-ctr-temp+i-i,line2Y);\n\n            ctr = ctr+(float)0.5;\n            if((lineStartX+temp+ctr)>lineEndX) {\n                expanding = true;\n                moving = false;\n            }\n        }\n\n\n        //Code to expand foglines\n\n        if(expanding) {\n\n            if(i<=5f) {\n                i=i+0.1f;\n                path1.reset();\n                path1.moveTo(lineStartX+ctr+temp+i,line1Y);\n                path1.lineTo(lineStartX+ctr-i,line1Y);\n\n                path2.reset();\n                path2.moveTo(lineEndX-ctr-temp+i,line2Y);\n                path2.lineTo(lineEndX-ctr-i,line2Y);\n\n\n            } else {\n                //Moving the fogline to the other end after expanding\n\n                path1.reset();\n                path1.moveTo(lineStartX + ctr +temp + i, line1Y);\n                path1.lineTo(lineStartX + ctr - i , line1Y);\n\n                path2.reset();\n                path2.moveTo(lineEndX-ctr-temp+i,line2Y);\n                path2.lineTo(lineEndX-ctr-i,line2Y);\n\n                ctr = ctr - 0.2f;\n                if (lineStartX + ctr <= lineStartX) {\n                    expanding = false;\n                    compress = true;\n                    ctr = 0.0f;\n                }\n            }\n        }\n\n\n        //Compressing the fogline to normal length\n        if(compress) {\n\n            if(i>0.0f) {\n                i = i - 0.1f;\n                path1.reset();\n                path1.moveTo(lineStartX + ctr - i, line1Y);\n                path1.lineTo(lineStartX + ctr + temp + i, line1Y);\n\n                path2.reset();\n                path2.moveTo(lineEndX-ctr-i,line2Y);\n                path2.lineTo(lineEndX-ctr-temp+i,line2Y);\n\n            } else {\n                compress = false;\n                moving = true;\n                if(isStatic)\n                {\n                    isAnimated = false;\n                }\n\n            }\n\n        }\n\n\n        canvas.drawPath(path1,paintFog);\n        canvas.drawPath(path2,paintFog);\n\n        if(isAnimated) {\n            invalidate();\n        }\n    }\n\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        if (isStatic) {\n            switch (event.getAction()) {\n                case MotionEvent.ACTION_UP:\n                    isAnimated = true;\n                    invalidate();\n            }\n\n        }\n\n        return true;\n    }\n}"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudHvRainView.java",
    "content": "package com.thbs.skycons.library;\n\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PointF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * This view draws cloud with heavy rain.\n */\npublic class CloudHvRainView extends SkyconView {\n\n    private static Paint paintCloud, paintRain;\n    private int screenW, screenH;\n    private float X, Y;\n    private Path  path1, path2, path3;\n    int m1=0, m2=0, m3=0, x1=0, y1=0, x2=0, y2=0, x3=0, y3=0;\n    int count1 = 0, count2 = 0, count3 = 0, i=0;\n    private double count;\n    boolean pointsStored = false;\n    double radius1, radius2;\n    Cloud cloud;\n\n    public CloudHvRainView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public CloudHvRainView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n    private void init() {\n\n        count = 0;\n\n        paintCloud = new Paint();\n        paintRain = new Paint();\n\n        //Paint for drawing cloud\n        paintCloud.setColor(strokeColor);\n        paintCloud.setStrokeWidth(10);\n        paintCloud.setAntiAlias(true);\n        paintCloud.setStrokeCap(Paint.Cap.ROUND);\n        paintCloud.setStrokeJoin(Paint.Join.ROUND);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        paintCloud.setShadowLayer(0, 0, 0, strokeColor);\n\n        //Paint for drawing rain drops\n        paintRain.setColor(strokeColor);\n        paintRain.setAntiAlias(true);\n        paintRain.setStrokeCap(Paint.Cap.ROUND);\n        paintRain.setStyle(Paint.Style.FILL_AND_STROKE);\n\n        cloud = new Cloud();\n\n        isAnimated = true;\n    }\n\n\n    // Initial declaration of the coordinates.\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w;\n        screenH = h;\n\n        X = screenW/2;\n        Y = (screenH/2);\n\n        radius1 = 90;\n        radius2 = 50;\n\n\n    }\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n\n        path1 = new Path();// pathCloud for drop 1\n        path2 = new Path();// pathCloud for drop 2\n        path3 = new Path();// pathCloud for drop 3\n\n        count = count+0.5;\n\n        paintCloud.setStrokeWidth((float) (0.02083 * screenW));\n        paintRain.setStrokeWidth((float) (0.015 * screenW));\n\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n            if(!isAnimated) {\n                // mark completion of animation\n                isAnimated = true;\n                //resetting counter on completion of a rotation\n                count = 0;\n            } else {\n                //resetting counter on completion of a rotation\n                count = 0;\n            }\n        }\n\n\n        PointF P1c2 = cloud.getP1c2(X,Y,screenW,count);\n        PointF P2c2 = cloud.getP2c2(X,Y,screenW,count);\n        PointF P1c1 = cloud.getP1c1(X,Y,screenW,count);\n\n        float P1Y = ((float) ((int) (0.1041667 * screenW) * Math.sin(Math.toRadians(80 + (0.111 * count))) + Y));\n\n        // Store starting x, y coordinates of rain drops\n        if(!pointsStored) {\n            x1 = (int) P1c2.x;\n            x2 = (int) P2c2.x;\n            x3 = (x1+x2)/2;\n\n            float value = (int) P1c2.y-((P1c1.y+P1Y)/2);\n            y1 = y2 = y3 = (int) (P1c2.y-value/2) - 20;\n\n            pointsStored = true;\n\n        }\n\n        if(isAnimated && isStatic) { //Initial static view\n            int  m = 95;\n\n            path1.moveTo(x1, y1 + (m - 24));\n            path1.lineTo(x1, y1 + m + (float)(Y*0.1));\n            canvas.drawPath(path1, paintRain);\n\n            path2.moveTo(x2, y2 + (m - 24));\n            path2.lineTo(x2, y2 + m + (float)(Y*0.1));\n            canvas.drawPath(path2, paintRain);\n\n            path3.moveTo(x3, y3 + ((m-50) - 24));\n            path3.lineTo(x3, y3 + (m-50) + (float)(Y*0.1));\n            canvas.drawPath(path3, paintRain);\n\n        } else { // Animating view\n\n            if(i<=2*49) {\n\n                if(i<2*25) {\n\n                    //drop11 logic\n                    if (m1 < 24) {\n                        path1.moveTo(x1, y1);\n\n                    } else {\n                        count1 = count1 + 4;\n                        path1.moveTo(x1, y1 + count1);\n                    }\n\n                    path1.lineTo(x1, y1 + m1 + (float)(Y*0.1));\n                    canvas.drawPath(path1, paintRain);\n\n                    m1 = m1 + 4;\n\n                    if (m1 == 100) {\n                        m1 = 0;\n                        count1 = 0;\n                    }\n\n                    //drop21 logic\n                    if(i>2*10) {\n\n                        if(m2 < 24) {\n                            path2.moveTo(x2, y2);\n\n                        } else {\n                            count2 = count2 + 4;\n                            path2.moveTo(x2, y2+count2);\n                        }\n\n                        path2.lineTo(x2, y2+m2+(float)(Y*0.1));\n                        canvas.drawPath(path2, paintRain);\n\n                        m2 = m2 + 4;\n\n                        if(m2 == 100) {\n                            m2 = 0;\n                            count2 = 0;\n                        }\n\n                    }\n\n                }\n\n                if(i>=2*25 && i<=2*49) {\n\n                    // drop 3\n                    if(m3 < 24) {\n                        path3.moveTo(x3, y3);\n\n                    } else {\n                        count3 = count3 + 4;\n                        path3.moveTo(x3, y3+count3);\n                    }\n\n                    path3.lineTo(x3, y3+m3+(float)(Y*0.1));\n                    canvas.drawPath(path3, paintRain);\n\n                    m3 = m3 + 4;\n\n                    if(m3 == 100) {\n                        m3 = 0;\n                        count3 = 0;\n                    }\n\n                    // drop21\n                    if(i<2*36) {\n\n                        if(m2 < 24) {\n                            path2.moveTo(x2, y2);\n\n                        } else {\n                            count2 = count2 + 4;\n                            path2.moveTo(x2, y2+count2);\n                        }\n\n                        path2.lineTo(x2, y2+m2+(float)(Y*0.1));\n                        canvas.drawPath(path2, paintRain);\n\n                        m2 = m2 + 4;\n\n                        if(m2 == 100) {\n                            m2 = 0;\n                            count2 = 0;\n                        }\n\n                    }\n\n                }\n\n\n            }\n\n            i+=2;\n\n            if(i == 2*50) {\n                i = 0;\n            }\n\n        }\n\n        // drawing cloud with fill\n        paintCloud.setColor(bgColor);\n        paintCloud.setStyle(Paint.Style.FILL);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        // drawing cloud with stroke\n        paintCloud.setColor(strokeColor);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        if(!isStatic || !isAnimated) {\n            invalidate();\n        }\n\n\n    }\n\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n                break;\n\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n\n        return true;\n\n    }\n\n\n}\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudMoonView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PathMeasure;\nimport android.graphics.PointF;\nimport android.graphics.RectF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * This view draws cloud with Moon.\n */\npublic class CloudMoonView extends SkyconView {\n\n    Paint paintCloud, paintMoon;\n    Path  pathMoon;\n    private int screenW, screenH;\n    private float X, Y, X2, Y2;\n    PathPoints[] pathPoints;\n    float m = 0;\n    float radius;\n    boolean clockwise = false;\n    float a=0, b=0, c=0, d=0;\n    private double count;\n    Cloud cloud;\n\n    public CloudMoonView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public CloudMoonView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n\n    private void init() {\n        //Paint for drawing cloud\n        paintCloud = new Paint();\n        paintCloud.setStrokeCap(Paint.Cap.ROUND);\n        paintCloud.setStrokeJoin(Paint.Join.ROUND);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        paintCloud.setAntiAlias(true);\n        paintCloud.setShadowLayer(0, 0, 0, strokeColor);\n\n        //Paint for drawing Moon\n        paintMoon = new Paint();\n        paintMoon.setColor(strokeColor);\n        paintMoon.setAntiAlias(true);\n        paintMoon.setStrokeCap(Paint.Cap.ROUND);\n        paintMoon.setStyle(Paint.Style.STROKE);\n\n        count = 0;\n        cloud = new Cloud();\n\n        isAnimated = true;\n\n    }\n\n    // Initial declaration of the coordinates.\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w;\n        screenH = h;\n\n        X = screenW/2;\n        Y = (screenH/2);\n\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n\n        paintCloud.setStrokeWidth((float)(0.02083*screenW));\n        paintMoon.setStrokeWidth((float)(0.02083*screenW));\n\n        count = count+0.5;\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n            if(!isAnimated) {\n                // mark completion of animation\n                isAnimated = true;\n                //resetting counter on completion of a rotation\n                count = 0;\n            } else {\n                //resetting counter on completion of a rotation\n                count = 0;\n            }\n        }\n\n        // Moon shape\n        pathMoon = new Path();\n        RectF rectF1 = new RectF();\n\n        PointF P5c1 = cloud.getP5c1(X,Y,screenW,count);\n        if(X2 == 0) {\n            X2 = P5c1.x;\n            Y2 = P5c1.y + (int)(0.042 * screenW);\n\n            radius = (int)(0.1042 * screenW);\n        }\n\n        if(!clockwise) { //Anticlockwise rotation\n\n            // First arc of the Moon.\n            rectF1.set(X2-radius, Y2-radius, X2+radius, Y2+radius);\n            pathMoon.addArc(rectF1, 65 - (m / 2), 275);\n\n            pathPoints = getPoints(pathMoon);\n\n            a = pathPoints[999].getX();\n            b = pathPoints[999].getY();\n            c = pathPoints[0].getX();\n            d = pathPoints[0].getY();\n\n            PointF p1 = cubic2Points(a, b, c, d, true);\n            PointF p2 = cubic2Points(a, b, c, d, false);\n\n            // Second arc of the Moon in opposite face.\n            pathMoon.moveTo(a, b);\n            pathMoon.cubicTo(p1.x, p1.y, p2.x, p2.y, c, d);\n\n            canvas.drawPath(pathMoon, paintMoon);\n\n            m = m + 0.5f;\n\n            if(m == 100) {\n                m = 0;\n                clockwise = !clockwise;\n            }\n\n        } else { //Clockwise rotation\n\n            // First arc of the Moon.\n            rectF1.set(X2-radius, Y2-radius, X2+radius, Y2+radius);\n            pathMoon.addArc(rectF1, 15 + (m / 2), 275);\n\n            pathPoints = getPoints(pathMoon);\n\n            a = pathPoints[999].getX();\n            b = pathPoints[999].getY();\n            c = pathPoints[0].getX();\n            d = pathPoints[0].getY();\n\n            PointF p1 = cubic2Points(a, b, c, d, true);\n            PointF p2 = cubic2Points(a, b, c, d, false);\n\n            // Second arc of the Moon in opposite face.\n            pathMoon.moveTo(a, b);\n            pathMoon.cubicTo(p1.x, p1.y, p2.x, p2.y, c, d);\n\n            canvas.drawPath(pathMoon, paintMoon);\n\n            m = m + 0.5f;\n\n            if(m == 100) {\n                m = 0;\n                clockwise = !clockwise;\n            }\n\n        }\n\n        // drawing cloud with fill\n        paintCloud.setColor(bgColor);\n        paintCloud.setStyle(Paint.Style.FILL);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        // drawing cloud with stroke\n        paintCloud.setColor(strokeColor);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        if(!isStatic || !isAnimated) {\n            invalidate();\n        }\n\n    }\n\n   // Used to get cubic 2 points between staring & end coordinates.\n    private PointF cubic2Points(float x1, float y1, float x2,\n                                     float y2, boolean left) {\n\n        PointF result = new PointF(0,0);\n        // finding center point between the coordinates\n        float dy = y2 - y1;\n        float dx = x2 - x1;\n        // calculating angle and the distance between center and the two points\n        float dangle = (float) ((Math.atan2(dy, dx) - Math.PI /2f));\n        float sideDist = (float)  - 0.5 * (float) Math.sqrt(dx * dx + dy * dy); //square\n\n        if (left){\n            //point from center to the left\n            result.x = (int) (Math.cos(dangle) * sideDist + x1);\n            result.y = (int) (Math.sin(dangle) * sideDist + y1);\n\n        } else {\n            //point from center to the right\n            result.x = (int) (Math.cos(dangle) * sideDist + x2);\n            result.y = (int) (Math.sin(dangle) * sideDist + y2);\n        }\n\n        return result;\n    }\n\n\n    // Used to fetch points from given path.\n    private PathPoints[] getPoints(Path path) {\n\n        //Size of 1000 indicates that, 1000 points\n        // would be extracted from the path\n        PathPoints[] pointArray = new PathPoints[1000];\n        PathMeasure pm = new PathMeasure(path, false);\n        float length = pm.getLength();\n        float distance = 0f;\n        float speed = length / 1000;\n        int counter = 0;\n        float[] aCoordinates = new float[2];\n\n        while ((distance < length) && (counter < 1000)) {\n            pm.getPosTan(distance, aCoordinates, null);\n            pointArray[counter] = new PathPoints(aCoordinates[0], aCoordinates[1]);\n            counter++;\n            distance = distance + speed;\n        }\n\n        return pointArray;\n    }\n\n    // Class for fetching path coordinates.\n    class PathPoints {\n\n        float x, y;\n\n        public PathPoints(float x, float y) {\n            this.x = x;\n            this.y = y;\n        }\n\n        public float getX() {\n            return x;\n        }\n\n        public float getY() {\n            return y;\n        }\n\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n                break;\n\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n\n        return true;\n\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudRainView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PointF;\nimport android.graphics.RectF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * This view draws cloud with rain.\n */\npublic class CloudRainView extends SkyconView {\n\n    private static Paint paintCloud, paintRain;\n    private int screenW, screenH;\n    private float X, Y;\n    private Path  pathRain;\n    int x1=0, y1=0, x2=0, y2=0, x3=0, y3=0;\n    float m = 0;\n    boolean drop1 = true, drop2 = false, drop3 = false;\n    private double count;\n    Cloud cloud;\n\n    public CloudRainView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public CloudRainView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n    private void init() {\n        count = 0;\n\n        paintCloud = new Paint();\n        paintRain = new Paint();\n\n        //Paint for drawing cloud\n        paintCloud.setColor(strokeColor);\n        paintCloud.setStrokeWidth(10);\n        paintCloud.setAntiAlias(true);\n        paintCloud.setStrokeCap(Paint.Cap.ROUND);\n        paintCloud.setStrokeJoin(Paint.Join.ROUND);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        paintCloud.setShadowLayer(0, 0, 0, strokeColor);\n\n        //Paint for drawing rain drops\n        paintRain.setColor(strokeColor);\n        paintRain.setAntiAlias(true);\n        paintRain.setStrokeCap(Paint.Cap.ROUND);\n        paintRain.setStyle(Paint.Style.FILL);\n\n        cloud = new Cloud();\n\n        isAnimated = true;\n\n    }\n\n    // Initial declaration of the coordinates.\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w;\n        screenH = h;\n\n        X = screenW/2;\n        Y = (screenH/2);\n\n    }\n\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n\n        paintCloud.setStrokeWidth((float)(0.02083*screenW));\n        paintRain.setStrokeWidth((float)(0.015*screenW));\n\n        pathRain = new Path(); // pathCloud for drop\n\n        count = count+0.5;\n\n        //comparison to check 360 degrees rotation\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n            if(!isAnimated) {\n                // mark completion of animation\n                isAnimated = true;\n                //resetting counter on completion of a rotation\n                count = 0;\n            } else {\n                //resetting counter on completion of a rotation\n                count = 0;\n            }\n        }\n\n        PointF P1c2 = cloud.getP1c2(X,Y,screenW,count);\n        PointF P1c1 = cloud.getP1c2(X,Y,screenW,count);\n        float P1Y = ((float) ((int) (0.1041667 * screenW) *\n                Math.sin(Math.toRadians(80 + (0.111 * count))) + Y));\n\n        PointF P2c2 = cloud.getP2c2(X,Y,screenW,count);\n        PointF P2c1 = cloud.getP2c2(X,Y,screenW,count);\n        float P2Y = ((float) (((int) (0.1041667 * screenW) + ((0.00023125 * screenW) * count))\n                * Math.sin(Math.toRadians(120 + (0.222 * count))) + Y));\n\n        if(isAnimated && isStatic) { //Initial static view\n\n            pathRain = new Path();\n\n            // 1st drop\n            if(x1==0) {\n                x1 = (int) P1c2.x;\n            }\n            if(y1==0) {\n                float value = (int) P1c2.y-((P1c1.y+P1Y)/2);\n                y1 = (int) (P1c2.y-value/2);\n            }\n\n            m = 95;\n            // Shape for rain drop\n            pathRain.moveTo(x1, y1);\n            pathRain.addArc(new RectF(x1 - 5, (y1 - 5) + m, x1 + 5, y1 + 5 + m), 180, -180);\n            pathRain.lineTo(x1, (y1 - 10) + m);\n            pathRain.close();\n\n\n            // 2nd drop\n            if(x2==0) {\n                x2 = (int) P2c2.x;\n            }\n            if(y2==0) {\n                float value = (int) P2c2.y-((P2c1.y+P2Y)/2);\n                y2 = (int) (P2c2.y-value/2);\n            }\n\n            pathRain.moveTo(x2, y2);\n            pathRain.addArc(new RectF(x2 - 5, (y2 - 5) + m, x2 + 5, y2 + 5 + m), 180, -180);\n            pathRain.lineTo(x2, (y2 - 10) + m);\n            pathRain.close();\n\n            // 3rd drop\n            if(x3==0) {\n                x3 = (x1+x2)/2;\n            }\n            if(y3==0) {\n                y3 = (y1+y2)/2;\n            }\n\n            pathRain.moveTo(x3, y3);\n            pathRain.addArc(new RectF(x3 - 5, (y3 - 5) + m/2, x3 + 5, y3 + 5 + m/2), 180, -180);\n            pathRain.lineTo(x3, (y3 - 10) + m/2);\n            pathRain.close();\n\n\n        } else { // Animating view\n\n            if(drop1) { // Drop 1 of the rain\n\n                pathRain = new Path();\n\n                if(x1==0) {\n                    x1 = (int) P1c2.x;\n                }\n                if(y1==0) {\n                    float value = (int) P1c2.y-((P1c1.y+P1Y)/2);\n                    y1 = (int) (P1c2.y-value/2);\n                }\n\n                // Shape for rain drop\n                pathRain.moveTo(x1, y1);\n                pathRain.addArc(new RectF(x1 - 5, (y1 - 5) + m, x1 + 5, y1 + 5 + m), 180, -180);\n                pathRain.lineTo(x1, (y1 - 10) + m);\n                pathRain.close();\n\n                if(m==100) {\n                    m=0;\n                    pathRain.reset();\n                    pathRain.moveTo(0, 0);\n                    drop2 = true;\n                    drop1 = false;\n                }\n            }\n\n            if(drop2) { // Drop 2 of the rain\n                pathRain = new Path();\n\n                if(x2==0) {\n                    x2 = (int) P2c2.x;\n                }\n                if(y2==0) {\n                    float value = (int) P2c2.y-((P2c1.y+P2Y)/2);\n                    y2 = (int) (P2c2.y-value/2);\n                }\n\n                pathRain.moveTo(x2, y2);\n                pathRain.addArc(new RectF(x2 - 5, (y2 - 5) + m, x2 + 5, y2 + 5 + m), 180, -180);\n                pathRain.lineTo(x2, (y2 - 10) + m);\n                pathRain.close();\n\n                if(m==100) {\n                    m=0;\n                    pathRain.reset();\n                    pathRain.moveTo(0, 0);\n                    drop2 = false;\n                    drop3 = true;\n                }\n            }\n\n            if(drop3) { // Drop 3 of the rain\n                pathRain = new Path();\n\n                if(x3==0) {\n                    x3 = (x1+x2)/2;\n                }\n                if(y3==0) {\n                    y3 = (y1+y2)/2;\n                }\n\n                pathRain.moveTo(x3, y3);\n                pathRain.addArc(new RectF(x3 - 5, (y3 - 5) + m, x3 + 5, y3 + 5 + m), 180, -180);\n                pathRain.lineTo(x3, (y3 - 10) + m);\n                pathRain.close();\n\n                if(m==100) {\n                    m=0;\n                    pathRain.reset();\n                    pathRain.moveTo(0, 0);\n                    // animate = false;\n                    drop3 = false;\n                    drop1 = true;\n                }\n            }\n\n        }\n\n        // First fill the shape with paint\n        paintRain.setStyle(Paint.Style.FILL);\n        canvas.drawPath(pathRain, paintRain);\n\n        // Then, draw the same pathCloud with paint stroke\n        paintRain.setStyle(Paint.Style.STROKE);\n        canvas.drawPath(pathRain, paintRain);\n\n        m = m+2.5f;\n\n        // drawing cloud with fill\n        paintCloud.setColor(bgColor);\n        paintCloud.setStyle(Paint.Style.FILL);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        // drawing cloud with stroke\n        paintCloud.setColor(strokeColor);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        if(!isStatic || !isAnimated) {\n            invalidate();\n        }\n\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n                break;\n\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n\n        return true;\n\n    }\n\n\n}\n\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudSnowView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PathMeasure;\nimport android.graphics.PointF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * This view draws cloud with snow.\n */\npublic class CloudSnowView extends SkyconView {\n\n    private Paint paintCloud, paintSnow;\n\n    PathPoints[] pathPoints11, pathPoints12, pathPoints21, pathPoints22,\n            pointsCircle11, pointsCircle12, pointsCircle21, pointsCircle22;\n\n    private int screenW, screenH;\n    private float X, Y;\n\n    private Path  path11, path12, path13,\n            path21, path22, path23, //visible drawn paths\n\n            cubicPath11, cubicPath12,\n            cubicPath21, cubicPath22, //Invisible paths for drop movement\n\n            pathCircle1, pathCircle2; //Invisible paths for rotate operation\n\n    int m=0, n=0, x1=0, y1=0, x2=0, y2=0;\n\n    boolean drop11 = true, drop12 = false, drop21 = false,\n            drop22 = false, pointsStored = false;\n\n    private double count;\n\n    Cloud cloud;\n\n    // Initial declaration of the coordinates.\n    public CloudSnowView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    // Initial declaration of the coordinates.\n    public CloudSnowView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n    private void init() {\n        count = 0;\n\n        paintCloud = new Paint();\n        paintSnow = new Paint();\n\n        paintCloud.setColor(strokeColor);\n        paintCloud.setAntiAlias(true);\n        paintCloud.setStrokeCap(Paint.Cap.ROUND);\n        paintCloud.setStrokeJoin(Paint.Join.ROUND);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        paintCloud.setShadowLayer(0, 0, 0, strokeColor);\n\n        paintSnow.setColor(strokeColor);\n        paintSnow.setAntiAlias(true);\n        paintSnow.setStrokeCap(Paint.Cap.ROUND);\n        paintSnow.setStyle(Paint.Style.STROKE);\n\n        cloud =  new Cloud();\n        pathCircle1 = new Path();\n\n        isAnimated = true;\n    }\n\n    // Initial declaration of the coordinates.\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w;\n        screenH = h;\n\n        X = screenW/2;\n        Y = (screenH/2);\n\n    }\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n\n        count = count+0.5;\n\n        paintCloud.setStrokeWidth((float)(0.02083*screenW));\n        paintSnow.setStrokeWidth((float) (0.01*screenW));\n\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n            if(!isAnimated) {\n                // mark completion of animation\n                isAnimated = true;\n                //resetting counter on completion of a rotation\n                count = 0;\n            } else {\n                //resetting counter on completion of a rotation\n                count = 0;\n            }\n        }\n\n        PointF P1c1 =  cloud.getP1c1(X,Y,screenW,count);\n        PointF P1c2 =  cloud.getP1c2(X,Y,screenW,count);\n        PointF P2c1 =  cloud.getP2c1(X,Y,screenW,count);\n        PointF P2c2 =  cloud.getP2c2(X,Y,screenW,count);\n\n        float P1Y = ((float) ((int) (0.1041667 * screenW) * Math.sin(Math.toRadians(80 + (0.111 * count))) + Y));\n        float P2Y = ((float) (((int) (0.1041667 * screenW) + ((0.00023125 * screenW) * count))\n                * Math.sin(Math.toRadians(120 + (0.222 * count))) + Y));\n\n\n        if(x1==0) {\n            x1 = (int) P1c2.x + 10;\n        }\n        if(y1==0) {\n            float value = (int) P1c2.y-((P1c1.y+P1Y)/2);\n            y1 = (int) (P1c2.y-value/2);\n        }\n\n        if(x2==0) {\n            x2 = (int) P2c2.x + 10;\n        }\n        if(y2==0) {\n            float value = (int) P2c2.y-((P2c1.y+P2Y)/2);\n            y2 = (int) (P2c2.y-value/2);\n        }\n\n        if(!pointsStored) {\n\n            // Store path coordinates for snow fall 1\n            cubicPath11 = new Path();\n            int height = screenH - y1;\n            cubicPath11.moveTo(x1, y1);\n            cubicPath11.cubicTo(x1-screenW*0.06f, y1+height*0.3f, x1-screenW*0.12f,\n                    y1+height*0.7f, x1-screenW*0.18f, y1+height*1.1f);\n            pathPoints11 = getPoints(cubicPath11);\n\n            // Store path coordinates for snow fall 2\n            cubicPath12 = new Path();\n            int x = x1-5;\n            cubicPath12.moveTo(x, y1);\n            cubicPath12.cubicTo(x+screenW*0.06f, y1+height*0.3f, x+screenW*0.1f,\n                    y1+height*0.7f, x-screenW*0.03f, y1+height*1.1f);\n            pathPoints12 = getPoints(cubicPath12);\n\n            // Store path coordinates for snow fall 3\n            cubicPath21 = new Path();\n            cubicPath21.moveTo(x2, y2);\n            cubicPath21.cubicTo(x2+screenW*0.06f, y2+height*0.3f, x2+screenW*0.12f,\n                    y2+height*0.7f, x2+screenW*0.18f, y2+height*1.1f);\n            pathPoints21 = getPoints(cubicPath21);\n\n            // Store path coordinates for snow fall 4\n            cubicPath22 = new Path();\n            int xx= x2+5;\n            cubicPath22.moveTo(xx, y2);\n            cubicPath22.cubicTo(xx-screenW*0.06f, y2+height*0.3f, xx-screenW*0.1f,\n                    y2+height*0.6f, xx+screenW*0.03f, y2+height*1.1f);\n            pathPoints22 = getPoints(cubicPath22);\n\n            pointsStored = true;\n        }\n\n\n        if(isAnimated && isStatic) { //Initial static view\n\n            int x = 55;\n\n            pathCircle2 = new Path();\n            pathCircle2.addCircle(pathPoints12[x].getX(), pathPoints12[x].getY(),\n                    screenW*0.03f, Path.Direction.CW);\n            pointsCircle12 = getPoints(pathCircle2);\n\n            //2nd drop\n            path21 = new Path();\n            path22 = new Path();\n            path23 = new Path();\n\n            int a = (25+x/5) >= 100 ? 25+x/5 - 100 : 25+x/5;\n            int b = (8+x/5) >= 100 ? 8+x/5 - 100 : 8+x/5;\n            int c = (40+x/5) >= 100 ? 40+x/5 - 100 : 40+x/5;\n\n            path21.moveTo(pointsCircle12[a].getX(), pointsCircle12[a].getY());\n            path22.moveTo(pointsCircle12[b].getX(), pointsCircle12[b].getY());\n            path23.moveTo(pointsCircle12[c].getX(), pointsCircle12[c].getY());\n\n            a = (75+x/5) >= 100 ? 75+x/5 - 100 : 75+x/5;\n            b = (59+x/5) >= 100 ? 59+x/5 - 100 : 59+x/5;\n            c = (90+x/5) >= 100 ? 90+x/5 - 100 : 90+x/5;\n\n            path21.lineTo(pointsCircle12[a].getX(), (pointsCircle12[a].getY()));\n            path22.lineTo(pointsCircle12[b].getX(), (pointsCircle12[b].getY()));\n            path23.lineTo(pointsCircle12[c].getX(), (pointsCircle12[c].getY()));\n\n            canvas.drawPath(path21, paintSnow);\n            canvas.drawPath(path22, paintSnow);\n            canvas.drawPath(path23, paintSnow);\n\n            // drawing cloud with fill\n            paintCloud.setColor(bgColor);\n            paintCloud.setStyle(Paint.Style.FILL);\n            canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n            // drawing cloud with stroke\n            paintCloud.setColor(strokeColor);\n            paintCloud.setStyle(Paint.Style.STROKE);\n            canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n            int y = 35;\n\n            pathCircle2 = new Path();\n            pathCircle2.addCircle(pathPoints22[y].getX(), pathPoints22[y].getY(),\n                    screenW*0.03f, Path.Direction.CW);\n            pointsCircle22 = getPoints(pathCircle2);\n\n            //2nd drop\n            path21 = new Path();\n            path22 = new Path();\n            path23 = new Path();\n\n            a = (25+y/5) >= 100 ? 25+y/5 - 100 : 25+y/5;\n            b = (8+y/5) >= 100 ? 8+y/5 - 100 : 8+y/5;\n            c = (40+y/5) >= 100 ? 40+y/5 - 100 : 40+y/5;\n\n            path21.moveTo(pointsCircle22[a].getX(), pointsCircle22[a].getY());\n            path22.moveTo(pointsCircle22[b].getX(), pointsCircle22[b].getY());\n            path23.moveTo(pointsCircle22[c].getX(), pointsCircle22[c].getY());\n\n            a = (75+y/5) >= 100 ? 75+y/5 - 100 : 75+y/5;\n            b = (59+y/5) >= 100 ? 59+y/5 - 100 : 59+y/5;\n            c = (90+y/5) >= 100 ? 90+y/5 - 100 : 90+y/5;\n\n            path21.lineTo(pointsCircle22[a].getX(), (pointsCircle22[a].getY()));\n            path22.lineTo(pointsCircle22[b].getX(), (pointsCircle22[b].getY()));\n            path23.lineTo(pointsCircle22[c].getX(), (pointsCircle22[c].getY()));\n\n            canvas.drawPath(path21, paintSnow);\n            canvas.drawPath(path22, paintSnow);\n            canvas.drawPath(path23, paintSnow);\n\n            // drawing cloud with fill\n            paintCloud.setColor(bgColor);\n            paintCloud.setStyle(Paint.Style.FILL);\n            canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n            // drawing cloud with stroke\n            paintCloud.setColor(strokeColor);\n            paintCloud.setStyle(Paint.Style.STROKE);\n            canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n\n        } else { // Animating view\n\n            if(drop11) {\n\n                pathCircle1 = new Path();\n                pathCircle1.addCircle(pathPoints11[m].getX(), pathPoints11[m].getY(),\n                        screenW*0.03f, Path.Direction.CW);\n                pointsCircle11 = getPoints(pathCircle1);\n\n                //1st drop\n                path11 = new Path();\n                path12 = new Path();\n                path13 = new Path();\n\n                int a = (25+m/5) >= 100 ? 25+m/5 - 100 : 25+m/5;\n                int b = (8+m/5) >= 100 ? 8+m/5 - 100 : 8+m/5;\n                int c = (40+m/5) >= 100 ? 40+m/5 - 100 : 40+m/5;\n\n                path11.moveTo(pointsCircle11[a].getX(), pointsCircle11[a].getY());\n                path12.moveTo(pointsCircle11[b].getX(), pointsCircle11[b].getY());\n                path13.moveTo(pointsCircle11[c].getX(), pointsCircle11[c].getY());\n\n                a = (75+m/5) >= 100 ? 75+m/5 - 100 : 75+m/5;\n                b = (59+m/5) >= 100 ? 59+m/5 - 100 : 59+m/5;\n                c = (90+m/5) >= 100 ? 90+m/5 - 100 : 90+m/5;\n\n                path11.lineTo(pointsCircle11[a].getX(), (pointsCircle11[a].getY()));\n                path12.lineTo(pointsCircle11[b].getX(), (pointsCircle11[b].getY()));\n                path13.lineTo(pointsCircle11[c].getX(), (pointsCircle11[c].getY()));\n\n                canvas.drawPath(path11, paintSnow);\n                canvas.drawPath(path12, paintSnow);\n                canvas.drawPath(path13, paintSnow);\n\n                // drawing cloud with fill\n                paintCloud.setColor(bgColor);\n                paintCloud.setStyle(Paint.Style.FILL);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                // drawing cloud with stroke\n                paintCloud.setColor(strokeColor);\n                paintCloud.setStyle(Paint.Style.STROKE);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                m = m+1;\n\n                if(m > 75) {\n\n                    pathCircle2 = new Path();\n                    pathCircle2.addCircle(pathPoints12[n].getX(), pathPoints12[n].getY(),\n                            screenW*0.03f, Path.Direction.CW);\n                    pointsCircle12 = getPoints(pathCircle2);\n\n                    //2nd drop\n                    path21 = new Path();\n                    path22 = new Path();\n                    path23 = new Path();\n\n                    a = (25+n/5) >= 100 ? 25+n/5 - 100 : 25+n/5;\n                    b = (8+n/5) >= 100 ? 8+n/5 - 100 : 8+n/5;\n                    c = (40+n/5) >= 100 ? 40+n/5 - 100 : 40+n/5;\n\n                    path21.moveTo(pointsCircle12[a].getX(), pointsCircle12[a].getY());\n                    path22.moveTo(pointsCircle12[b].getX(), pointsCircle12[b].getY());\n                    path23.moveTo(pointsCircle12[c].getX(), pointsCircle12[c].getY());\n\n                    a = (75+n/5) >= 100 ? 75+n/5 - 100 : 75+n/5;\n                    b = (59+n/5) >= 100 ? 59+n/5 - 100 : 59+n/5;\n                    c = (90+n/5) >= 100 ? 90+n/5 - 100 : 90+n/5;\n\n                    path21.lineTo(pointsCircle12[a].getX(), (pointsCircle12[a].getY()));\n                    path22.lineTo(pointsCircle12[b].getX(), (pointsCircle12[b].getY()));\n                    path23.lineTo(pointsCircle12[c].getX(), (pointsCircle12[c].getY()));\n\n                    canvas.drawPath(path21, paintSnow);\n                    canvas.drawPath(path22, paintSnow);\n                    canvas.drawPath(path23, paintSnow);\n\n                    // drawing cloud with fill\n                    paintCloud.setColor(bgColor);\n                    paintCloud.setStyle(Paint.Style.FILL);\n                    canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                    // drawing cloud with stroke\n                    paintCloud.setColor(strokeColor);\n                    paintCloud.setStyle(Paint.Style.STROKE);\n                    canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                    n = n+1;\n\n                }\n\n                if(m==100) {\n                    m=0;\n                    path11.reset();\n                    path11.moveTo(0, 0);\n                    path12.reset();\n                    path12.moveTo(0, 0);\n                    path13.reset();\n                    path13.moveTo(0, 0);\n\n                    x1=0;\n                    y1=0;\n\n                    x2=0;\n                    y2=0;\n\n                    drop12 = true;\n                    drop11 = false;\n\n                }\n\n            }\n\n            if(drop12) {\n\n                pathCircle2 = new Path();\n                pathCircle2.addCircle(pathPoints12[n].getX(), pathPoints12[n].getY(),\n                        screenW*0.03f, Path.Direction.CW);\n                pointsCircle12 = getPoints(pathCircle2);\n\n                //2nd drop\n                path21 = new Path();\n                path22 = new Path();\n                path23 = new Path();\n\n                int a = (25+n/5) >= 100 ? 25+n/5 - 100 : 25+n/5;\n                int b = (8+n/5) >= 100 ? 8+n/5 - 100 : 8+n/5;\n                int c = (40+n/5) >= 100 ? 40+n/5 - 100 : 40+n/5;\n\n                path21.moveTo(pointsCircle12[a].getX(), pointsCircle12[a].getY());\n                path22.moveTo(pointsCircle12[b].getX(), pointsCircle12[b].getY());\n                path23.moveTo(pointsCircle12[c].getX(), pointsCircle12[c].getY());\n\n                a = (75+n/5) >= 100 ? 75+n/5 - 100 : 75+n/5;\n                b = (59+n/5) >= 100 ? 59+n/5 - 100 : 59+n/5;\n                c = (90+n/5) >= 100 ? 90+n/5 - 100 : 90+n/5;\n\n                path21.lineTo(pointsCircle12[a].getX(), (pointsCircle12[a].getY()));\n                path22.lineTo(pointsCircle12[b].getX(), (pointsCircle12[b].getY()));\n                path23.lineTo(pointsCircle12[c].getX(), (pointsCircle12[c].getY()));\n\n                canvas.drawPath(path21, paintSnow);\n                canvas.drawPath(path22, paintSnow);\n                canvas.drawPath(path23, paintSnow);\n\n                // drawing cloud with fill\n                paintCloud.setColor(bgColor);\n                paintCloud.setStyle(Paint.Style.FILL);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                // drawing cloud with stroke\n                paintCloud.setColor(strokeColor);\n                paintCloud.setStyle(Paint.Style.STROKE);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                n = n+1;\n\n                if(n==100) {\n                    m=0;\n                    n=0;\n                    path21.reset();\n                    path21.moveTo(0, 0);\n                    path22.reset();\n                    path22.moveTo(0, 0);\n                    path23.reset();\n                    path23.moveTo(0, 0);\n\n                    x1=0;\n                    y1=0;\n\n                    drop21 = true;\n                    drop11 = false;\n                    drop12 = false;\n\n                }\n\n            }\n\n            if(drop21) {\n\n                pathCircle1 = new Path();\n                pathCircle1.addCircle(pathPoints21[m].getX(), pathPoints21[m].getY(),\n                        screenW*0.03f, Path.Direction.CW);\n                pointsCircle21 = getPoints(pathCircle1);\n\n                //1st drop\n                path11 = new Path();\n                path12 = new Path();\n                path13 = new Path();\n\n                int a = (25+m/5) >= 100 ? 25+m/5 - 100 : 25+m/5;\n                int b = (8+m/5) >= 100 ? 8+m/5 - 100 : 8+m/5;\n                int c = (40+m/5) >= 100 ? 40+m/5 - 100 : 40+m/5;\n\n                path11.moveTo(pointsCircle21[a].getX(), pointsCircle21[a].getY());\n                path12.moveTo(pointsCircle21[b].getX(), pointsCircle21[b].getY());\n                path13.moveTo(pointsCircle21[c].getX(), pointsCircle21[c].getY());\n\n                a = (75+m/5) >= 100 ? 75+m/5 - 100 : 75+m/5;\n                b = (59+m/5) >= 100 ? 59+m/5 - 100 : 59+m/5;\n                c = (90+m/5) >= 100 ? 90+m/5 - 100 : 90+m/5;\n\n                path11.lineTo(pointsCircle21[a].getX(), (pointsCircle21[a].getY()));\n                path12.lineTo(pointsCircle21[b].getX(), (pointsCircle21[b].getY()));\n                path13.lineTo(pointsCircle21[c].getX(), (pointsCircle21[c].getY()));\n\n                canvas.drawPath(path11, paintSnow);\n                canvas.drawPath(path12, paintSnow);\n                canvas.drawPath(path13, paintSnow);\n\n                // drawing cloud with fill\n                paintCloud.setColor(bgColor);\n                paintCloud.setStyle(Paint.Style.FILL);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                // drawing cloud with stroke\n                paintCloud.setColor(strokeColor);\n                paintCloud.setStyle(Paint.Style.STROKE);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                m = m+1;\n\n                if(m > 75) {\n\n                    pathCircle2 = new Path();\n                    pathCircle2.addCircle(pathPoints22[n].getX(), pathPoints22[n].getY(),\n                            screenW*0.03f, Path.Direction.CW);\n                    pointsCircle22 = getPoints(pathCircle2);\n\n                    //2nd drop\n                    path21 = new Path();\n                    path22 = new Path();\n                    path23 = new Path();\n\n                    a = (25+n/5) >= 100 ? 25+n/5 - 100 : 25+n/5;\n                    b = (8+n/5) >= 100 ? 8+n/5 - 100 : 8+n/5;\n                    c = (40+n/5) >= 100 ? 40+n/5 - 100 : 40+n/5;\n\n                    path21.moveTo(pointsCircle22[a].getX(), pointsCircle22[a].getY());\n                    path22.moveTo(pointsCircle22[b].getX(), pointsCircle22[b].getY());\n                    path23.moveTo(pointsCircle22[c].getX(), pointsCircle22[c].getY());\n\n                    a = (75+n/5) >= 100 ? 75+n/5 - 100 : 75+n/5;\n                    b = (59+n/5) >= 100 ? 59+n/5 - 100 : 59+n/5;\n                    c = (90+n/5) >= 100 ? 90+n/5 - 100 : 90+n/5;\n\n                    path21.lineTo(pointsCircle22[a].getX(), (pointsCircle22[a].getY()));\n                    path22.lineTo(pointsCircle22[b].getX(), (pointsCircle22[b].getY()));\n                    path23.lineTo(pointsCircle22[c].getX(), (pointsCircle22[c].getY()));\n\n                    canvas.drawPath(path21, paintSnow);\n                    canvas.drawPath(path22, paintSnow);\n                    canvas.drawPath(path23, paintSnow);\n\n                    // drawing cloud with fill\n                    paintCloud.setColor(bgColor);\n                    paintCloud.setStyle(Paint.Style.FILL);\n                    canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                    // drawing cloud with stroke\n                    paintCloud.setColor(strokeColor);\n                    paintCloud.setStyle(Paint.Style.STROKE);\n                    canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                    n = n+1;\n\n                }\n\n                if(m==100) {\n                    m=0;\n                    path11.reset();\n                    path11.moveTo(0, 0);\n                    path12.reset();\n                    path12.moveTo(0, 0);\n                    path13.reset();\n                    path13.moveTo(0, 0);\n\n                    x1=0;\n                    y1=0;\n\n                    drop22 = true;\n                    drop21 = false;\n                }\n\n            }\n\n            if(drop22) {\n\n                pathCircle2 = new Path();\n                pathCircle2.addCircle(pathPoints22[n].getX(), pathPoints22[n].getY(),\n                        screenW*0.03f, Path.Direction.CW);\n                pointsCircle22 = getPoints(pathCircle2);\n\n                //2nd drop\n                path21 = new Path();\n                path22 = new Path();\n                path23 = new Path();\n\n                int a = (25+n/5) >= 100 ? 25+n/5 - 100 : 25+n/5;\n                int b = (8+n/5) >= 100 ? 8+n/5 - 100 : 8+n/5;\n                int c = (40+n/5) >= 100 ? 40+n/5 - 100 : 40+n/5;\n\n                path21.moveTo(pointsCircle22[a].getX(), pointsCircle22[a].getY());\n                path22.moveTo(pointsCircle22[b].getX(), pointsCircle22[b].getY());\n                path23.moveTo(pointsCircle22[c].getX(), pointsCircle22[c].getY());\n\n                a = (75+n/5) >= 100 ? 75+n/5 - 100 : 75+n/5;\n                b = (59+n/5) >= 100 ? 59+n/5 - 100 : 59+n/5;\n                c = (90+n/5) >= 100 ? 90+n/5 - 100 : 90+n/5;\n\n                path21.lineTo(pointsCircle22[a].getX(), (pointsCircle22[a].getY()));\n                path22.lineTo(pointsCircle22[b].getX(), (pointsCircle22[b].getY()));\n                path23.lineTo(pointsCircle22[c].getX(), (pointsCircle22[c].getY()));\n\n                canvas.drawPath(path21, paintSnow);\n                canvas.drawPath(path22, paintSnow);\n                canvas.drawPath(path23, paintSnow);\n\n                // drawing cloud with fill\n                paintCloud.setColor(bgColor);\n                paintCloud.setStyle(Paint.Style.FILL);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                // drawing cloud with stroke\n                paintCloud.setColor(strokeColor);\n                paintCloud.setStyle(Paint.Style.STROKE);\n                canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n                n = n+1;\n\n                if(n==100) {\n                    m=0;\n                    n=0;\n                    path21.reset();\n                    path21.moveTo(0, 0);\n                    path22.reset();\n                    path22.moveTo(0, 0);\n                    path23.reset();\n                    path23.moveTo(0, 0);\n\n                    x1=0;\n                    y1=0;\n\n                    drop11 = true;\n                    drop12 = false;\n                    drop21 = false;\n                    drop22 = false;\n\n                }\n\n            }\n\n        }\n\n        if(!isStatic || !isAnimated) {\n            invalidate();\n        }\n\n    }\n\n    // Used to fetch points from given path.\n    private PathPoints[] getPoints(Path path) {\n\n        //Size of 100 indicates that, 100 points\n        // would be extracted from the path\n        PathPoints[] pointArray = new PathPoints[100];\n        PathMeasure pm = new PathMeasure(path, false);\n        float length = pm.getLength();\n        float distance = 0f;\n        float speed = length / 100;\n        int counter = 0;\n        float[] aCoordinates = new float[2];\n\n        while ((distance < length) && (counter < 100)) {\n            pm.getPosTan(distance, aCoordinates, null);\n            pointArray[counter] = new PathPoints(aCoordinates[0], aCoordinates[1]);\n            counter++;\n            distance = distance + speed;\n        }\n\n        return pointArray;\n    }\n\n    // Class for fetching path coordinates.\n    class PathPoints {\n\n        float x, y;\n\n        public PathPoints(float x, float y) {\n            this.x = x;\n            this.y = y;\n        }\n\n        public float getX() {\n            return x;\n        }\n\n        public float getY() {\n            return y;\n        }\n\n    }\n\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n                break;\n\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n\n        return true;\n\n    }\n\n\n}"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudSunView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PointF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n\npublic class CloudSunView extends SkyconView {\n\n    private static Paint paint;\n    private int screenW, screenH;\n    private float X,Y,XSun,YSun;\n    private Path path, path1;\n    private double count;\n    int degrees;\n    float startAngle;\n    float sweepAngle;\n    Cloud cloud;\n\n    public CloudSunView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n\n\n    public CloudSunView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n\n    private void init() {\n\n        // initialize default values\n        degrees = 0;\n        count = 0;\n        startAngle = 45;\n        sweepAngle = 165;\n        isAnimated = true;\n        paint = new Paint();\n\n        paint.setColor(strokeColor);\n        paint.setStrokeWidth(10);\n        paint.setAntiAlias(true);\n        paint.setStrokeCap(Paint.Cap.ROUND);\n        paint.setStrokeJoin(Paint.Join.ROUND);\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setShadowLayer(0, 0, 0, Color.BLACK);\n\n        cloud =  new Cloud();\n\n    }\n\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w; //getting Screen Width\n        screenH = h;// getting Screen Height\n\n        // center point of Screen\n        X = screenW/2;\n        Y = (screenH/2);\n\n    }\n\n\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n        // set stroke width\n        paint.setStrokeWidth((float) (0.02083 * screenW));\n\n        // initializing paths\n        path = new Path();\n        path1 = new Path();\n\n        // positioning Sun with respect to cloud\n        PointF P5c1 = cloud.getP5c1(X,Y,screenW,count);\n        if(XSun==0) {\n            // center point for Sun\n            XSun = P5c1.x;\n            YSun = P5c1.y + (int)(0.042 * screenW);\n        }\n\n        //incrementing counter for rotation\n        count = count+0.5;\n\n        //comparison to check 360 degrees rotation\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n\n            if(!isAnimated){\n                // mark completion of animation\n                isAnimated = true;\n                //resetting counter on completion of a rotation\n                count = 0;\n            }else {\n                //resetting counter on completion of a rotation\n                count = 0;\n            }\n        }\n\n        // drawing center circle\n        path.addCircle(XSun,YSun, (int)(0.083 * screenW), Path.Direction.CW);\n\n        // drawing arms of sun\n        for(int i=0;i<360;i+=45){\n            path1.moveTo(XSun,YSun);\n            float x1 = (float)((int)(0.1146 * screenW) * Math.cos(Math.toRadians(i+count/4))+XSun); //arm pointX at radius 50 with incrementing angle from center of sun\n            float y1 = (float)((int)(0.1146 * screenW) * Math.sin(Math.toRadians(i+count/4))+YSun);//arm pointY at radius 50 with incrementing angle from center of sun\n            float X2 = (float)((int)(0.1563 * screenW) * Math.cos(Math.toRadians(i+count/4))+XSun);//arm pointX at radius 65 with incrementing angle from center of sun\n            float Y2 = (float)((int)(0.1563 * screenW) * Math.sin(Math.toRadians(i+count/4))+YSun);//arm pointY at radius 65 with incrementing angle from center of sun\n            path1.moveTo(x1,y1); // draw arms of sun\n            path1.lineTo(X2,Y2);\n\n        }\n\n        // drawing sun\n        canvas.drawPath(path, paint);\n        canvas.drawPath(path1, paint);\n\n        // drawing cloud with fill\n        paint.setColor(bgColor);\n        paint.setStyle(Paint.Style.FILL);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paint);\n\n        // drawing cloud with stroke\n        paint.setColor(strokeColor);\n        paint.setStyle(Paint.Style.STROKE);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paint);\n\n\n        if(!isStatic || !isAnimated) {\n             // invalidate if not static or not animating\n            invalidate();\n        }\n\n\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n\n                break;\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n        return true;\n    }\n}"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudThunderView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PathMeasure;\nimport android.graphics.PointF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\npublic class CloudThunderView extends SkyconView {\n\n\n    int ctr = 0;\n    int ctr2 = 0;\n    float thHeight;\n    PathPoints[] leftPoints;\n    Boolean check;\n    private Paint paintCloud,paintThunder;\n    private int screenW, screenH;\n    private float X, Y;\n    private Path thPath,thFillPath;\n\n    private double count;\n    Cloud cloud;\n\n    public CloudThunderView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public CloudThunderView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n\n    // Initial declaration of the coordinates.\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w; //getting Screen Width\n        screenH = h; // getting Screen Height\n\n        // center point  of Screen\n        X = screenW/2;\n        Y = (screenH/2);\n\n    }\n\n    private void init() {\n\n        count = 0;\n        check = false;\n        thHeight = 0;\n        thPath = new Path();\n        thFillPath = new Path();\n\n        if(isStatic)\n        {\n            isAnimated=false;\n        }\n        else\n        {\n            isAnimated = true;\n        }\n        paintCloud = new Paint();\n        paintCloud.setColor(strokeColor);\n        paintCloud.setStrokeWidth((screenW / 25));\n        paintCloud.setAntiAlias(true);\n        paintCloud.setStrokeCap(Paint.Cap.ROUND);\n        paintCloud.setStrokeJoin(Paint.Join.ROUND);\n        paintCloud.setStyle(Paint.Style.STROKE);\n        paintCloud.setShadowLayer(0, 0, 0, Color.BLACK);\n\n        paintThunder = new Paint();\n        paintThunder.setColor(strokeColor);\n        paintThunder.setStrokeWidth(10);\n        paintThunder.setAntiAlias(true);\n        paintThunder.setStrokeCap(Paint.Cap.ROUND);\n        paintThunder.setStrokeJoin(Paint.Join.ROUND);\n        paintThunder.setStyle(Paint.Style.STROKE);\n        paintThunder.setShadowLayer(0, 0, 0, Color.BLACK);\n\n        cloud = new Cloud();\n\n    }\n\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        canvas.drawColor(bgColor);\n\n        paintCloud.setStrokeWidth((float) (0.02083 * screenW));\n        paintThunder.setStrokeWidth((float)(0.02083*screenW));\n\n        //incrementing counter for rotation\n        count = count+0.5;\n\n        //comparison to check 360 degrees rotation\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n            //resetting counter on completion of a rotation\n            count = 0;\n        }\n\n        PointF P2c1 = cloud.getP2c1(X,Y,screenW,count);\n\n        //Setting up the height of thunder from the cloud\n        if(thHeight==0)\n        {\n            thHeight = P2c1.y;\n        }\n        float startHeight = thHeight-(thHeight*0.1f);\n\n        //Setting up X coordinates of thunder\n        float path2StartX = X+(X*0.04f);\n\n\n\n        //Calculating coordinates of thunder\n\n        thPath.moveTo(path2StartX, startHeight);\n\n\n        thPath.lineTo(X - (X * 0.1f), startHeight + (startHeight * 0.2f)); //1\n\n\n        thPath.lineTo(X + (X * 0.03f), startHeight + (startHeight * 0.15f));\n\n\n        thPath.lineTo(X - (X * 0.08f), startHeight + (startHeight * 0.3f));\n\n\n        leftPoints = getPoints(thPath);\n\n        if(ctr<=98) {\n\n            if(check==false) {\n\n                thFillPath.moveTo(leftPoints[ctr].getX(),leftPoints[ctr].getY());\n                thFillPath.lineTo(leftPoints[ctr + 1].getX(), leftPoints[ctr + 1].getY());\n\n\n\n            }\n            else\n            {\n                //Once filled, erasing the fill from top to bottom\n                thFillPath.reset();\n                thFillPath.moveTo(leftPoints[ctr].getX(), leftPoints[ctr].getY());\n                for(int i=ctr+1;i< leftPoints.length-1;i++)\n                {\n                    thFillPath.lineTo(leftPoints[i].getX(), leftPoints[i].getY());\n\n                }\n            }\n            ctr = ctr+1;\n        }\n        else\n        {\n            if(isStatic) {\n                if (ctr2 == 2) {\n                    isAnimated = false;\n                    ctr2 = 0;\n                }\n                ctr2++;\n            }\n\n            ctr=0;\n            if(check==false)\n            {\n                check=true;\n            }\n            else\n            {\n                check=false;\n            }\n\n\n        }\n\n        if(!isAnimated)\n        {\n            thFillPath.reset();\n            thFillPath.moveTo(leftPoints[0].getX(), leftPoints[0].getY());\n            for(int i=ctr+1;i< leftPoints.length-1;i++)\n            {\n                thFillPath.lineTo(leftPoints[i].getX(), leftPoints[i].getY());\n\n            }\n        }\n\n        canvas.drawPath(thFillPath,paintThunder);\n\n        paintCloud.setStyle(Paint.Style.FILL);\n        paintCloud.setColor(Color.WHITE);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        paintCloud.setStyle(Paint.Style.STROKE);\n        paintCloud.setColor(Color.BLACK);\n        canvas.drawPath(cloud.getCloud(X,Y,screenW,count), paintCloud);\n\n        if(isAnimated) {\n            invalidate();\n        }\n\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        if(isStatic)\n        {\n            switch (event.getAction())\n            {\n                case MotionEvent.ACTION_UP:\n                    isAnimated = true;\n                    invalidate();\n                    break;\n\n            }\n        }\n        return true;\n    }\n\n      private PathPoints[] getPoints(Path path) {\n        PathPoints[] pointArray = new PathPoints[100];\n        PathMeasure pm = new PathMeasure(path, false);\n        float length = pm.getLength();\n        float distance = 0f;\n        float speed = length / 100;\n        int counter = 0;\n        float[] aCoordinates = new float[2];\n\n        while ((distance < length) && (counter < 100)) {\n            // get point from the pathMoon\n            pm.getPosTan(distance, aCoordinates, null);\n            pointArray[counter] = new PathPoints(aCoordinates[0], aCoordinates[1]);\n            counter++;\n            distance = distance + speed;\n        }\n\n        return pointArray;\n    }\n\n    class PathPoints {\n\n        float x, y;\n\n        public PathPoints(float x, float y) {\n            this.x = x;\n            this.y = y;\n        }\n\n        public float getX() {\n            return x;\n        }\n\n        public float getY() {\n            return y;\n        }\n\n    }\n}"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/CloudView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\npublic class CloudView extends SkyconView {\n\n    private Paint paint;\n    private int screenW, screenH;\n    private float X, Y;\n    private double count;\n    Cloud c;\n\n    public CloudView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public CloudView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n\n\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w; //getting Screen Width\n        screenH = h; // getting Screen Height\n\n        // center point  of Screen\n        X = screenW/2;\n        Y = (screenH/2);\n\n        c =  new Cloud();\n\n    }\n\n    private void init() {\n\n        // initialize default values\n        count = 0;\n        isAnimated = true;\n\n        paint = new Paint();\n        paint.setColor(strokeColor);\n        paint.setStrokeWidth((screenW/25));\n        paint.setAntiAlias(true);\n        paint.setStrokeCap(Paint.Cap.ROUND);\n        paint.setStrokeJoin(Paint.Join.ROUND);\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setShadowLayer(0, 0, 0, Color.BLACK);\n\n    }\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n\n        // set stroke width\n        paint.setStrokeWidth((float)(0.02083*screenW));\n\n        //incrementing counter for rotation\n\n        count = count+0.5;\n\n        //comparison to check 360 degrees rotation\n        int retval = Double.compare(count, 360.00);\n\n        if(retval == 0) {\n\n            if(!isAnimated) {\n                // mark completion of animation\n                isAnimated = true;\n                //resetting counter on completion of a rotation\n                count = 0;\n            } else {\n                //resetting counter on completion of a rotation\n                count = 0;\n            }\n        }\n\n        // draw cloud\n        canvas.drawPath(c.getCloud(X,Y,screenW,count), paint);\n\n        if(!isStatic || !isAnimated) {\n            // invalidate if not static or not animating\n            invalidate();\n\n\n        }\n\n\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n\n                break;\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/MoonView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PathMeasure;\nimport android.graphics.PointF;\nimport android.graphics.RectF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * This view draws the Moon.\n */\npublic class MoonView extends SkyconView {\n\n    Paint paint;\n    Path path;\n    private int screenW, screenH;\n    private float X, Y;\n    PathPoints[] pathPoints;\n    float m = 0;\n    float radius;\n    boolean clockwise = false;\n    float a=0, b=0, c=0, d=0;\n\n    int count = 0; //counter for stopping animation\n\n    public MoonView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public MoonView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n    private void init() {\n        //Paint for drawing Moon\n        paint = new Paint();\n        paint.setColor(strokeColor);\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setAntiAlias(true);\n        paint.setStrokeCap(Paint.Cap.ROUND);\n\n        isAnimated = true;\n    }\n\n    // Initial declaration of the coordinates.\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w;\n        screenH = h;\n\n        X = screenW/2;\n        Y = (screenH/2);\n\n        radius = (int)(0.1458 * screenW);\n\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n\n        paint.setStrokeWidth((float) (0.02083 * screenW));\n\n        path = new Path();\n\n        RectF rectF1 = new RectF();\n\n        if(!clockwise) {//Anticlockwise rotation\n\n            // First arc of the Moon.\n            rectF1.set(X-radius, Y-radius, X+radius, Y+radius);\n            path.addArc(rectF1, 65-(m/2), 275);\n\n            pathPoints = getPoints(path);\n\n            a = pathPoints[999].getX();\n            b = pathPoints[999].getY();\n            c = pathPoints[0].getX();\n            d = pathPoints[0].getY();\n\n            PointF P1c1 = cubic2Points(a, b, c, d, true);\n            PointF P1c2 = cubic2Points(a, b, c, d, false);\n\n            // Second arc of the Moon in opposite face.\n            path.moveTo(a, b);\n            path.cubicTo(P1c1.x, P1c1.y, P1c2.x, P1c2.y, c, d);\n\n            canvas.drawPath(path, paint);\n\n            m = m + 0.5f;\n\n            if(m == 100) {\n                m = 0;\n                clockwise = !clockwise;\n            }\n\n        } else {//Clockwise rotation\n\n            // First arc of the Moon.\n            rectF1.set(X-radius, Y-radius, X+radius, Y+radius);\n            path.addArc(rectF1, 15+(m/2), 275);\n\n            pathPoints = getPoints(path);\n\n            a = pathPoints[999].getX();\n            b = pathPoints[999].getY();\n            c = pathPoints[0].getX();\n            d = pathPoints[0].getY();\n\n            PointF P1c1 = cubic2Points(a, b , c, d, true);\n            PointF P1c2 = cubic2Points(a, b, c, d, false);\n\n            // Second arc of the Moon in opposite face.\n            path.moveTo(a, b);\n            path.cubicTo(P1c1.x, P1c1.y, P1c2.x, P1c2.y, c, d);\n\n            canvas.drawPath(path, paint);\n\n            m = m + 0.5f;\n\n            if(m == 100) {\n                m = 0;\n                clockwise = !clockwise;\n\n                if(!isAnimated) {\n                    count ++;\n                }\n\n            }\n\n        }\n\n        if(!isStatic || !isAnimated) {\n\n            if(count < 3) {\n                // invalidate if not static or not animating\n                invalidate();\n\n            } else {\n                count = 0;\n            }\n\n        }\n\n    }\n\n    // Used to fetch points from given path.\n    private PathPoints[] getPoints(Path path) {\n\n        //Size of 1000 indicates that, 1000 points\n        // would be extracted from the path\n        PathPoints[] pointArray = new PathPoints[1000];\n        PathMeasure pm = new PathMeasure(path, false);\n        float length = pm.getLength();\n        float distance = 0f;\n        float speed = length / 1000;\n        int counter = 0;\n        float[] aCoordinates = new float[2];\n\n        while ((distance < length) && (counter < 1000)) {\n            pm.getPosTan(distance, aCoordinates, null);\n            pointArray[counter] = new PathPoints(aCoordinates[0], aCoordinates[1]);\n            counter++;\n            distance = distance + speed;\n        }\n\n        return pointArray;\n    }\n\n    // Class for fetching path coordinates.\n    class PathPoints {\n\n        float x, y;\n\n        public PathPoints(float x, float y) {\n            this.x = x;\n            this.y = y;\n        }\n\n        public float getX() {\n            return x;\n        }\n\n        public float getY() {\n            return y;\n        }\n\n    }\n\n    private PointF cubic2Points(float x1, float y1, float x2, float y2, boolean left) {\n\n        PointF result = new PointF(0,0);\n        // finding center point between the coordinates\n        float dy = y2 - y1;\n        float dx = x2 - x1;\n        // calculating angle and the distance between center and the two points\n        float dangle = (float) ((Math.atan2(dy, dx) - Math.PI /2f));\n        float sideDist = (float)  - 0.6 * (float) Math.sqrt(dx * dx + dy * dy); //square\n\n        if (left){\n            //point from center to the left\n            result.x = (int) (Math.cos(dangle) * sideDist + x1);\n            result.y = (int) (Math.sin(dangle) * sideDist + y1);\n\n        } else {\n            //point from center to the right\n            result.x = (int) (Math.cos(dangle) * sideDist + x2);\n            result.y = (int) (Math.sin(dangle) * sideDist + y2);\n        }\n\n        return result;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n                break;\n\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/SkyconView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Color;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.View;\n\npublic class SkyconView extends View {\n    protected boolean isStatic =false;\n    boolean isAnimated = false;\n    int strokeColor = Color.parseColor(\"#000000\");\n    int bgColor = Color.parseColor(\"#ffffff\");\n\n    public SkyconView(Context context) {\n        super(context);\n    //    extractAttributes(context);\n    }\n\n    public SkyconView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        extractAttributes(context,attrs);\n    }\n\n    private void extractAttributes(Context context, AttributeSet attrs) {\n        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.custom_view);\n\n        // get attributes from layout\n        isStatic = a.getBoolean(R.styleable.custom_view_isStatic, this.isStatic);\n        strokeColor = a.getColor(R.styleable.custom_view_strokeColor, this.strokeColor);\n\n        if(strokeColor == 0){\n\n            strokeColor = Color.BLACK;\n        }\n\n        bgColor = a.getColor(R.styleable.custom_view_bgColor, this.bgColor);\n\n        if(bgColor == 0) {\n            bgColor = Color.WHITE;\n        }\n\n        a.recycle();\n    }\n\n\n    public boolean isStatic() {\n        return isStatic;\n    }\n\n    public void setIsStatic(boolean isStatic) {\n        this.isStatic = isStatic;\n    }\n\n    public boolean isAnimated() {\n        return isAnimated;\n    }\n\n    public void setIsAnimated(boolean isAnimated) {\n        this.isAnimated = isAnimated;\n    }\n\n    public int getStrokeColor() {\n        return strokeColor;\n    }\n\n    public void setStrokeColor(int strokeColor) {\n        Log.e(\"strokecolor\",\"\"+strokeColor);\n        this.strokeColor = strokeColor;\n    }\n\n    public int getBgColor() {\n        return bgColor;\n    }\n\n    public void setBgColor(int bgColor) {\n        this.bgColor = bgColor;\n    }\n}"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/SunView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\npublic class SunView extends SkyconView {\n\n    private static Paint paint;\n    private int screenW, screenH;\n    private float X, Y;\n    private Path path, path1;\n    private double count;\n\n    public SunView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        init();\n    }\n\n    public SunView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    private void init() {\n\n        // initialize default values\n        count = 0;\n        paint = new Paint();\n\n        paint.setColor(strokeColor);\n\n        paint.setAntiAlias(true);\n        paint.setStrokeCap(Paint.Cap.ROUND);\n        paint.setStrokeJoin(Paint.Join.ROUND);\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setShadowLayer(0, 0, 0, strokeColor);\n\n        path= new Path();\n        isAnimated = true;\n\n\n    }\n\n    @Override\n    public void onSizeChanged (int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w; //getting Screen Width\n        screenH = h;// getting Screen Height\n\n        // center point  of Screen\n        X = screenW/2;\n        Y = (screenH/2);\n\n        path.moveTo(X, Y);\n\n    }\n\n\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n\n        // initializing paths\n        path = new Path();\n        path1 = new Path();\n        // set stroke width\n        paint.setStrokeWidth((float) (0.02083 * screenW));\n\n        //incrementing counter for rotation\n        count = count+0.1;\n\n        //comparison to check 360 degrees rotation\n        int retval = Double.compare(count, 360.00);\n\n        if(retval > 0) {\n\n            if(!isAnimated) {\n                // mark completion of animation\n                isAnimated = true;\n                //resetting counter on completion of a rotation\n                count = 0;\n            }else {\n                //resetting counter on completion of a rotation\n                count = 0;\n            }\n        }\n\n        // drawing center circle\n        path.addCircle(X,Y, (int)(0.1042 * screenW), Path.Direction.CW);\n\n        // drawing arms of sun\n        for(int i=0;i<360;i+=45){\n            path1.moveTo(X,Y);\n            float x1 = (float)((int)(0.1458 * screenW) * Math.cos(Math.toRadians(i+count))+X); //arm pointX at radius 50 with incrementing angle from center of sun\n            float y1 = (float)((int)(0.1458 * screenW) * Math.sin(Math.toRadians(i+count))+Y);//arm pointY at radius 50 with incrementing angle from center of sun\n            float X2 = (float)((int)(0.1875 * screenW) * Math.cos(Math.toRadians(i+count))+X);//arm pointX at radius 65 with incrementing angle from center of sun\n            float Y2 = (float)((int)(0.1875 * screenW) * Math.sin(Math.toRadians(i+count))+Y);//arm pointY at radius 65 with incrementing angle from center of sun\n            path1.moveTo(x1,y1); // draw arms of sun\n            path1.lineTo(X2,Y2);\n\n        }\n\n        // drawing paths on canvas\n        canvas.drawPath(path, paint);\n        canvas.drawPath(path1, paint);\n\n        if(!isStatic || !isAnimated) {\n            // invalidate if not static or not animating\n            invalidate();\n\n\n        }\n\n\n\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n            case MotionEvent.ACTION_UP:\n                // start animation if it is not animating\n                if(isStatic && isAnimated) {\n                    isAnimated = false;\n                }\n\n                break;\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/java/com/thbs/skycons/library/WindView.java",
    "content": "package com.thbs.skycons.library;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PathMeasure;\nimport android.graphics.PointF;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * Created by administrator on 18/09/14.\n */\n\npublic class WindView extends SkyconView {\n\n    private static Paint paint;\n    private int screenW, screenH;\n    private float X, Y, X2, Y2,  X11, Y11, Y21, X21, Xc, Yc;\n    private Path tracePath, windPath, leafPath;\n    private double count;\n    int degrees;\n    boolean isFirstPath;\n    PathPoints[] points;\n    boolean isFirst;\n\n    public WindView(Context context,boolean isStatic,boolean isAnimated, int strokeColor , int backgroundColor) {\n        super(context);\n\n        this.isStatic = isStatic;\n        this.isAnimated = isAnimated;\n        this.strokeColor = strokeColor;\n        this.bgColor = backgroundColor;\n\n        init();\n    }\n\n    public WindView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init();\n    }\n\n\n    private void init() {\n\n        // initialize default values\n        isFirstPath = true;\n        windPath = new Path();\n        leafPath = new Path();\n        tracePath = new Path();\n        count = 0;\n        degrees = 200;\n\n        isAnimated = true;\n        isFirst = true;\n        paint = new Paint();\n\n        paint.setColor(strokeColor);\n        paint.setStrokeWidth(screenW/25);\n        paint.setAntiAlias(true);\n        paint.setStrokeCap(Paint.Cap.ROUND);\n        paint.setStrokeJoin(Paint.Join.ROUND);\n        paint.setStyle(Paint.Style.STROKE);\n\n    }\n\n    @Override\n    public void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        screenW = w;\n        screenH = h;\n\n        X = 0;\n        Y = (float) (screenH / 1.5);\n        tracePath.moveTo(X, Y);\n\n    }\n\n\n    @Override\n    public void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        // set canvas background color\n        canvas.drawColor(bgColor);\n        // set stroke width\n        paint.setStrokeWidth((float)(0.02083*screenW));\n\n        //initializing the paths\n        windPath = new Path();\n        leafPath = new Path();\n        int retval;\n\n        //comparison to check 360 degrees rotation\n        retval = Double.compare(count, 310.00);\n\n        if (retval > 0) {\n\n            //resetting counter and initializing values on completion of a rotation\n                tracePath = new Path(); //reinitializing tracepath\n                count = 0; //resetting counter\n                degrees = 200;//resetting leaf's starting angle\n                isFirstPath = !isFirstPath;//resetting path flag\n\n        }\n\n        if (isFirstPath) {\n\n            int retval1 = Double.compare(count, 130.00);\n            if (retval1 == 0) {\n                if(!isAnimated) {\n                    if(!isFirst){\n                        // mark completion of animation\n                        isAnimated =true;\n                    } else{\n                        // mark continuation of animation\n                        isFirst = false;\n                        isAnimated = false;\n                    }\n                }\n            }\n\n            if(isStatic && isAnimated) {\n                // center position if static\n                count =130;\n            } else {\n                //incrementing counter for rotation\n                count += 1;\n\n            }\n\n\n\n            // trace for first path\n            X = 0;\n            Y = (float) (screenH / 1.5);\n            X2 = (float) (screenW + 50);\n            Y2 = (float) (screenH/4);\n\n            tracePath.moveTo(X,Y);\n            PointF P1c1 = calculateTriangle(X, Y, X2, Y2, true, 0.2,\"CCW\");\n            PointF P1c2 = calculateTriangle(X, Y, X2, Y2, false, 0.2,\"CCW\");\n            tracePath.cubicTo(P1c1.x, P1c1.y, P1c2.x, P1c2.y, X2, Y2);\n\n            //getting points from the trace path\n            points = getPoints(tracePath);\n\n        } else {\n\n                if (count < 150) {\n                    //incrementing counter faster\n                    count += 1.5;\n\n                } else {\n                    //incrementing counter slower\n                    count += 1;\n                }\n\n\n            // trace for second path\n            X = 0;\n            Y = (float) (screenH / 1.5);\n            X2 = (float) (screenW / 2);\n            Y2 = (float) (screenH / 3);\n            Xc = (float) (screenW + 10);\n            Yc = (float) (screenH / 2);\n\n            tracePath.moveTo(X - 5, Y);\n            tracePath.cubicTo(X + (screenW/3.2f), Y + (screenW/12), X + (screenW/2.0f), Y - (screenW/3.2f), X + (screenW/2.5f), Y - (screenW/2.8235f));\n            tracePath.cubicTo(X + (screenW/2.7f), Y - (screenW/2.7428f), X + (screenW/3.2f), Y - (screenW/3f), X + (screenW/3.0f), Y - (screenW/3.6923f));\n            tracePath.cubicTo(X + (screenW/2.6f), Y - (screenW/6), X + (screenW/1.5f), Y - (screenW/9.6f), screenW+50, Y - (screenW/2.4f));\n\n            //getting points from the trace path\n            points = getPoints(tracePath);\n\n        }\n\n        if (count <= 20) {\n            // draw nothing\n\n        } else if ((count >20)&&(count <= 60)) {\n            // draw initial path of length 60\n            for (int i = 0; i < (count - 20); i++) {\n\n                windPath.moveTo(points[i].getX(), points[i].getY());\n                windPath.lineTo(points[i + 1].getX(), points[i + 1].getY());\n\n            }\n        } else if (count >= 249) {\n            // draw path of decrementing length from last\n\n            for (int i = (int)count - 60 ; i <= 248; i++) {\n\n                windPath.moveTo(points[i].getX(), points[i].getY());\n                windPath.lineTo(points[i + 1].getX(), points[i + 1].getY());\n\n            }\n\n        } else {\n            // move initial path of length 60\n            for (int i = (int) (count - 60); i < (count - 20); i++) {\n\n                windPath.moveTo(points[i].getX(), points[i].getY());\n                windPath.lineTo(points[i + 1].getX(), points[i + 1].getY());\n\n            }\n\n        }\n\n        // draw windpath\n\n        canvas.drawPath(windPath, paint);\n\n        if((int) count <250 ) {\n\n            // initialize coordinates for leaf\n            Xc = points[(int) (count)].getX();\n            Yc = points[(int) (count)].getY();\n            X11 = (float) (((screenW * 4) / 100) * Math.cos(Math.toRadians\n                    ((degrees + count) - 30)) + Xc);\n            Y11 = (float) (((screenW * 4) / 100) * Math.sin(Math.toRadians((degrees + count) - 30)) + Yc);\n            X21 = (float) (((screenW * 12) / 100) * Math.cos(Math.toRadians((degrees + count))) + Xc);\n            Y21 = (float) (((screenW * 12) / 100) * Math.sin(Math.toRadians((degrees + count))) + Yc);\n\n            // getting points in between coordinates for leaf shape\n            PointF P11c1 = calculateTriangle(Xc, Yc, X21, Y21, true, 0.7,\"CW\");\n            PointF P11c2 = calculateTriangle(Xc, Yc, X21, Y21, false, 0.7,\"CW\");\n            PointF P21c1 = calculateTriangle(X21, Y21, X11, Y11, true, 0.8,\"CW\");\n            PointF P21c2 = calculateTriangle(X21, Y21, X11, Y11, false, 0.8,\"CW\");\n            PointF P31c1 = calculateTriangle(X11, Y11, Xc, Yc, true, 0.2,\"CCW\");\n            PointF P31c2 = calculateTriangle(X11, Y11, Xc, Yc, false, 0.2,\"CCW\");\n\n            // drawing arcs between coordinates\n            leafPath.moveTo(Xc, Yc);\n            leafPath.cubicTo(P11c1.x, P11c1.y, P11c2.x, P11c2.y, X21, Y21);\n            leafPath.cubicTo(P21c1.x, P21c1.y, P21c2.x, P21c2.y, X11, Y11);\n            leafPath.cubicTo(P31c1.x, P31c1.y, P31c2.x, P31c2.y, Xc, Yc);\n\n            // drawing leaf on canvas\n            paint.setColor(bgColor);\n            paint.setStyle(Paint.Style.FILL);\n            canvas.drawPath(leafPath, paint);\n            paint.setStyle(Paint.Style.STROKE);\n            paint.setColor(strokeColor);\n            canvas.drawPath(leafPath, paint);\n        }\n\n\n\n        if(!isStatic || !isAnimated) {\n            // invalidate if not static or not animating\n            invalidate();\n        }\n\n\n    }\n\n    private PathPoints[] getPoints(Path path) {\n\n        // getting points from path\n\n        PathPoints[] pointArray = new PathPoints[250]; // initialize array of length 250\n        PathMeasure pm = new PathMeasure(path, false);// measure path size\n        float length = pm.getLength();// get length\n        float distance = 0f;\n        float speed = length / 250;// to get 250 points\n        int counter = 0;\n        float[] aCoordinates = new float[2];\n\n        // iterate through path for points\n        while ((distance < length) && (counter < 250)) {\n            pm.getPosTan(distance, aCoordinates, null);\n            pointArray[counter] = new PathPoints(aCoordinates[0], aCoordinates[1]);\n            counter++;\n            distance = distance + speed;\n        }\n\n        return pointArray;\n    }\n\n\n    class PathPoints {\n\n        // class to hold coordinates\n        float x, y;\n\n        public PathPoints(float x, float y) {\n            this.x = x;\n            this.y = y;\n        }\n\n        public float getX() {\n            return x;\n        }\n\n        public float getY() {\n            return y;\n        }\n\n    }\n    private PointF calculateTriangle(float x1, float y1, float x2, float y2, boolean left, double distOffset,String dir) {\n\n        PointF result = new PointF(0, 0);\n        // finding center point between the coordinates\n        float dy = y2 - y1;\n        float dx = x2 - x1;\n\n\n        float dangle = 0;\n        float sideDist = 0;\n\n        // calculating angle and the distance between center and the two points with direction\n        if (dir == \"CW\") {\n            dangle = (float) ((Math.atan2(dy, dx) - Math.PI / 2f));\n            sideDist = (float) distOffset * (float) Math.sqrt(dx * dx + dy * dy); //square\n        } else if (dir == \"CCW\") {\n            dangle = (float) ((Math.atan2(dy, dx) + Math.PI / 2f));\n            sideDist = (float) distOffset * (float) Math.sqrt(dx * dx + dy * dy); //square\n        }\n\n        if (left) {\n            //point from center to the left\n            result.x = (int) (Math.cos(dangle) * sideDist + x1);\n            result.y = (int) (Math.sin(dangle) * sideDist + y1);\n        } else {\n            //point from center to the right\n            result.x = (int) (Math.cos(dangle) * sideDist + x2);\n            result.y = (int) (Math.sin(dangle) * sideDist + y2);\n        }\n        return result;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                // nothing to do\n                return true;\n            case MotionEvent.ACTION_MOVE:\n                // nothing to do\n                break ;\n            case MotionEvent.ACTION_UP:\n\n                if(isStatic && isAnimated) {\n                    // start animation if it is not animating\n                    isFirst = true;\n                    isAnimated = false;\n                }\n\n                break;\n            default:\n                return false;\n        }\n\n        // Schedules a repaint.\n        if(!isAnimated) {\n            invalidate();\n        }\n\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/res/layout/activity_main.xml",
    "content": "<RelativeLayout 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:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:text=\"@string/hello_world\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/res/menu/main.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\".MainActivity\" >\n    <item android:id=\"@+id/action_settings\"\n        android:title=\"@string/action_settings\"\n        android:orderInCategory=\"100\"\n         />\n</menu>\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"custom_view\">\n        <attr name=\"isStatic\" format=\"boolean\" />\n        <attr name=\"strokeColor\" format=\"color\" />\n        <attr name=\"bgColor\" format=\"color\" />\n    </declare-styleable>\n\n</resources>"
  },
  {
    "path": "Skycons/SkyconsLibrary/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": "Skycons/SkyconsLibrary/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">SkyconsLibrary</string>\n    <string name=\"hello_world\">Hello world!</string>\n    <string name=\"action_settings\">Settings</string>\n\n</resources>\n"
  },
  {
    "path": "Skycons/SkyconsLibrary/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": "Skycons/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.3.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        jcenter()\n    }\n}\n"
  },
  {
    "path": "Skycons/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Aug 09 14:54:47 IST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-3.3-all.zip\n"
  },
  {
    "path": "Skycons/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Settings specified in this file will override any Gradle settings\n# configured through the IDE.\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": "Skycons/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# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\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\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\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\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": "Skycons/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\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%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "Skycons/settings.gradle",
    "content": "include ':SkyconDemo', ':SkyconsLibrary'\n"
  }
]