[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n      <entry name=\"!?*.aj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n            <option value=\"$PROJECT_DIR$/calendar\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/markdown-navigator/profiles_settings.xml",
    "content": "<component name=\"MarkdownNavigator.ProfileManager\">\n  <settings default=\"\" pdf-export=\"\" />\n</component>"
  },
  {
    "path": ".idea/markdown-navigator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"MarkdownProjectSettings\">\n    <PreviewSettings splitEditorLayout=\"SPLIT\" splitEditorPreview=\"PREVIEW\" useGrayscaleRendering=\"false\" zoomFactor=\"2.0\" maxImageWidth=\"0\" showGitHubPageIfSynced=\"false\" allowBrowsingInPreview=\"false\" synchronizePreviewPosition=\"true\" highlightPreviewType=\"NONE\" highlightFadeOut=\"5\" highlightOnTyping=\"true\" synchronizeSourcePosition=\"true\" verticallyAlignSourceAndPreviewSyncPosition=\"true\" showSearchHighlightsInPreview=\"false\" showSelectionInPreview=\"true\">\n      <PanelProvider>\n        <provider providerId=\"com.vladsch.idea.multimarkdown.editor.swing.html.panel\" providerName=\"Default - Swing\" />\n      </PanelProvider>\n    </PreviewSettings>\n    <ParserSettings gitHubSyntaxChange=\"false\">\n      <PegdownExtensions>\n        <option name=\"ABBREVIATIONS\" value=\"false\" />\n        <option name=\"ANCHORLINKS\" value=\"true\" />\n        <option name=\"ASIDE\" value=\"false\" />\n        <option name=\"ATXHEADERSPACE\" value=\"true\" />\n        <option name=\"AUTOLINKS\" value=\"true\" />\n        <option name=\"DEFINITIONS\" value=\"false\" />\n        <option name=\"DEFINITION_BREAK_DOUBLE_BLANK_LINE\" value=\"false\" />\n        <option name=\"FENCED_CODE_BLOCKS\" value=\"true\" />\n        <option name=\"FOOTNOTES\" value=\"false\" />\n        <option name=\"HARDWRAPS\" value=\"false\" />\n        <option name=\"HTML_DEEP_PARSER\" value=\"false\" />\n        <option name=\"INSERTED\" value=\"false\" />\n        <option name=\"QUOTES\" value=\"false\" />\n        <option name=\"RELAXEDHRULES\" value=\"true\" />\n        <option name=\"SMARTS\" value=\"false\" />\n        <option name=\"STRIKETHROUGH\" value=\"true\" />\n        <option name=\"SUBSCRIPT\" value=\"false\" />\n        <option name=\"SUPERSCRIPT\" value=\"false\" />\n        <option name=\"SUPPRESS_HTML_BLOCKS\" value=\"false\" />\n        <option name=\"SUPPRESS_INLINE_HTML\" value=\"false\" />\n        <option name=\"TABLES\" value=\"true\" />\n        <option name=\"TASKLISTITEMS\" value=\"true\" />\n        <option name=\"TOC\" value=\"false\" />\n        <option name=\"WIKILINKS\" value=\"true\" />\n      </PegdownExtensions>\n      <ParserOptions>\n        <option name=\"COMMONMARK_LISTS\" value=\"true\" />\n        <option name=\"DUMMY\" value=\"false\" />\n        <option name=\"EMOJI_SHORTCUTS\" value=\"true\" />\n        <option name=\"FLEXMARK_FRONT_MATTER\" value=\"false\" />\n        <option name=\"GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA\" value=\"false\" />\n        <option name=\"GFM_TABLE_RENDERING\" value=\"true\" />\n        <option name=\"GITBOOK_URL_ENCODING\" value=\"false\" />\n        <option name=\"GITHUB_EMOJI_URL\" value=\"false\" />\n        <option name=\"GITHUB_LISTS\" value=\"false\" />\n        <option name=\"GITHUB_WIKI_LINKS\" value=\"true\" />\n        <option name=\"JEKYLL_FRONT_MATTER\" value=\"false\" />\n        <option name=\"SIM_TOC_BLANK_LINE_SPACER\" value=\"true\" />\n      </ParserOptions>\n    </ParserSettings>\n    <HtmlSettings headerTopEnabled=\"false\" headerBottomEnabled=\"false\" bodyTopEnabled=\"false\" bodyBottomEnabled=\"false\" embedUrlContent=\"false\" addPageHeader=\"true\">\n      <GeneratorProvider>\n        <provider providerId=\"com.vladsch.idea.multimarkdown.editor.swing.html.generator\" providerName=\"Default Swing HTML Generator\" />\n      </GeneratorProvider>\n      <headerTop />\n      <headerBottom />\n      <bodyTop />\n      <bodyBottom />\n    </HtmlSettings>\n    <CssSettings previewScheme=\"UI_SCHEME\" cssUri=\"\" isCssUriEnabled=\"false\" isCssTextEnabled=\"false\" isDynamicPageWidth=\"true\">\n      <StylesheetProvider>\n        <provider providerId=\"com.vladsch.idea.multimarkdown.editor.swing.html.css\" providerName=\"Default Swing Stylesheet\" />\n      </StylesheetProvider>\n      <ScriptProviders />\n      <cssText />\n    </CssSettings>\n    <HtmlExportSettings updateOnSave=\"false\" parentDir=\"$ProjectFileDir$\" targetDir=\"$ProjectFileDir$\" cssDir=\"\" scriptDir=\"\" plainHtml=\"false\" imageDir=\"\" copyLinkedImages=\"false\" imageUniquifyType=\"0\" targetExt=\"\" useTargetExt=\"false\" noCssNoScripts=\"false\" linkToExportedHtml=\"true\" exportOnSettingsChange=\"true\" regenerateOnProjectOpen=\"false\" />\n    <LinkMapSettings>\n      <textMaps />\n    </LinkMapSettings>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml___jb_old___",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_7\" default=\"true\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n  <component name=\"SvnConfiguration\" myUseAcceleration=\"nothing\">\n    <configuration useDefault=\"false\">C:\\Users\\David\\AppData\\Roaming\\Subversion</configuration>\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>1.8</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/CalendarView.iml\" filepath=\"$PROJECT_DIR$/CalendarView.iml\" />\n      <module fileurl=\"file://E:\\code\\android project\\CalendarView\\CalendarView.iml\" filepath=\"E:\\code\\android project\\CalendarView\\CalendarView.iml\" />\n      <module fileurl=\"file://E:\\code\\android project\\CalendarView\\TestCal.iml\" filepath=\"E:\\code\\android project\\CalendarView\\TestCal.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n      <module fileurl=\"file://E:\\code\\android project\\CalendarView\\app\\app.iml\" filepath=\"E:\\code\\android project\\CalendarView\\app\\app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/calendar/calendar.iml\" filepath=\"$PROJECT_DIR$/calendar/calendar.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "CalendarView\n============\n\n\n#####  包含三个自定义View 日历仪表盘 圆盘\n---------------------------------------\n> 这是使用RecyclerView做的日历，比之前ViewPager不管从逻辑，功能更加强大，实现更加简单。之前ViewPager的日历没有功能逻辑分离，这次提供全新IDrawFormat接口，比如你需要针对某些日期增加标签，你就可以实现IDrawFormat,然后addDrawFormat就可以了，这样就实现标签和其他逻辑混合导致逻辑混乱，按顺序多层绘制，默认只提供文字层（日历日期和农历），但也需要自己add。你可以设置先后顺序，完美实现所有功能。可以支持任何样式。当前前提你会一点Android canvas绘制。月模式也完成，以后会提供小米日历类似功能。\n\n\n![github](new.gif)\n\n![github](screenshort.gif)\n\n##### 日历 支持翻页，点击日期，日期状态 ###\n![github](screenshort_cal.png)\n\n##### 仪表盘 可根据配置改变圆弧，设置字体颜色和配置颜色，指针大小，字体大小打开动画等 ###\n![github](screenshort_dash.png)\n\n##### 圆盘 可根据配置改变个数，支持点击单个圆弧回调，设置字体和配置颜色,分割线，阴影打开动画等 ###\n![github](screenshort_ring.png)\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"26.0.2\"\n\n    aaptOptions {\n        cruncherEnabled = false\n        useNewCruncher = false\n\n    }\n\n    defaultConfig {\n        applicationId \"com.palmwifi.testcal\"\n        minSdkVersion 14\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\n\ndependencies {\n    compile fileTree(include: ['*.jar'], dir: 'libs')\n    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {\n        exclude group: 'com.android.support', module: 'support-annotations'\n    })\n    compile 'com.android.support:appcompat-v7:25.3.1'\n    compile 'com.android.support:cardview-v7:25.3.1'\n    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha9'\n    testCompile 'junit:junit:4.12'\n    compile project(':calendar')\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in C:\\Users\\David\\AppData\\Local\\Android\\Sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "app/src/androidTest/java/com/palmwifi/testcal/ExampleInstrumentedTest.java",
    "content": "package com.palmwifi.testcal;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumentation test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() throws Exception {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"com.palmwifi.testcal\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.palmwifi.testcal\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n\n    <application\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".HomeActivity\">\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        <activity android:name=\".CalendarActivity\"/>\n        <activity android:name=\".DashBoardActivity\"/>\n        <activity android:name=\".RingActivity\"/>\n        <activity android:name=\".CalendarMonthActivity\"/>\n        <activity android:name=\".CalendarWeekActivity\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/CalendarActivity.java",
    "content": "package com.palmwifi.testcal;\n\nimport android.os.Handler;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.palmwifi.testcal.calendar.CalendarView;\nimport com.palmwifi.testcal.calendar.CalendarViewBuilder;\nimport com.palmwifi.testcal.calendar.CalendarViewPagerAdapter;\nimport com.palmwifi.testcal.calendar.CalendarViewPagerListener;\nimport com.palmwifi.testcal.calendar.CustomDate;\nimport com.palmwifi.testcal.calendar.OnCalenderListener;\nimport com.palmwifi.testcal.calendar.RecordState;\n\npublic class CalendarActivity extends AppCompatActivity implements OnCalenderListener,View.OnClickListener {\n\n    private ViewPager monthViewPager;\n    private TextView mDateTv;\n    private CalendarView[] monthViews;\n    private CalendarViewPagerListener monthPagerListener;\n    private int cellHeight;\n    private ImageView leftImg;\n    private ImageView rightImg;\n    private int rows;\n    private Handler mHandler = new Handler();\n    private CustomDate mShowDate;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        monthViewPager = (ViewPager) findViewById(R.id.viewpager);\n        mDateTv = (TextView) findViewById(R.id.tv_show_date);\n        monthViews = CalendarViewBuilder.createMonthCalendarViews(this, 5,false, this);\n        leftImg = (ImageView) findViewById(R.id.img_cal_left);\n        rightImg = (ImageView) findViewById(R.id.img_cal_right);\n\n        setViewPager();\n        leftImg.setOnClickListener(this);\n        rightImg.setOnClickListener(this);\n    }\n\n    private void setViewPager() {\n\n        CalendarViewPagerAdapter<CalendarView> viewPagerAdapter = new CalendarViewPagerAdapter<>(monthViews);\n        monthViewPager.setAdapter(viewPagerAdapter);\n        monthViewPager.setCurrentItem(498);\n        monthPagerListener = new CalendarViewPagerListener(monthViewPager, viewPagerAdapter);\n        monthViewPager.addOnPageChangeListener(monthPagerListener);\n        mHandler.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                monthViewPager.requestLayout();\n            }\n        }, 150);\n\n\n    }\n\n    @Override\n    public void clickDate(CustomDate date) {\n        Toast.makeText(this,\"点击\"+date.toString(),Toast.LENGTH_SHORT).show();\n    }\n\n    @Override\n    public void showDate(CustomDate date) {\n        if (mShowDate == null || !date.isSameDay(mShowDate)) {\n            mShowDate = date;\n            mDateTv.setText(date.year + \"年\" + date.month + \"月\");\n        }\n    }\n\n\n    @Override\n    public void onMeasureCellHeight(int cellSpace) {\n        cellHeight = cellSpace;\n        if (rows != 0) {\n            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) monthViewPager.getLayoutParams();\n            lp.height = rows * cellHeight;\n            monthViewPager.setLayoutParams(lp);\n        }\n    }\n\n\n    @Override\n    public void changeRowCount(int rows) {\n        this.rows = rows;\n        if (cellHeight != 0) {\n            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) monthViewPager.getLayoutParams();\n            lp.height = rows * cellHeight;\n            monthViewPager.setLayoutParams(lp);\n        }\n    }\n\n    @Override\n    public RecordState setSignDateStatus(CustomDate date) {\n        if (date.getYear() == 2017 && date.getMonth() <= 4) {\n            if (date.getDay() % 10 <= 3) {\n                return RecordState.Sign;\n            } else if (date.getDay() % 10 <= 6) {\n                return RecordState.Buckle;\n            } else {\n                return RecordState.UnSign;\n            }\n        }\n        return null;\n    }\n\n    @Override\n    public void onClick(View v) {\n        switch (v.getId()){\n            case R.id.img_cal_left:\n                monthViewPager.setCurrentItem(monthViewPager.getCurrentItem()-1);\n                break;\n            case R.id.img_cal_right:\n                monthViewPager.setCurrentItem(monthViewPager.getCurrentItem()+1);\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/CalendarMonthActivity.java",
    "content": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\nimport android.support.v7.widget.RecyclerView;\nimport android.widget.TextView;\n\nimport com.bin.david.calendar.CalendarRecyclerHelper;\nimport com.bin.david.calendar.CalendarView;\nimport com.bin.david.calendar.CustomDate;\nimport com.palmwifi.testcal.newcalendar.CustomCalendarAdapter;\n\n/**\n * Created by huang on 2017/11/9.\n */\n\npublic class CalendarMonthActivity extends AppCompatActivity{\n\n    private RecyclerView recyclerView;\n    private TextView showTv;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_calendar);\n        showTv = (TextView) findViewById(R.id.tv_show_date);\n        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);\n        CalendarRecyclerHelper.init(this, recyclerView, new CustomCalendarAdapter(), new CalendarView.OnCalendarPageChanged() {\n            @Override\n            public void onPageChanged(CustomDate showDate) {\n                showTv.setText(showDate.year+\"年\"+showDate.month+\"月\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/CalendarWeekActivity.java",
    "content": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\nimport android.support.v7.widget.RecyclerView;\nimport android.widget.TextView;\n\nimport com.bin.david.calendar.CalendarRecyclerHelper;\nimport com.bin.david.calendar.CalendarView;\nimport com.bin.david.calendar.CustomDate;\nimport com.palmwifi.testcal.newcalendar.CustomCalendarAdapter;\n\n/**\n * Created by huang on 2017/11/9.\n */\n\npublic class CalendarWeekActivity extends AppCompatActivity{\n\n    private RecyclerView recyclerView;\n    private TextView showTv;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_calendar);\n        showTv = (TextView) findViewById(R.id.tv_show_date);\n        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);\n        CalendarRecyclerHelper.init(this, recyclerView, new CustomCalendarAdapter(CustomCalendarAdapter.WEEK_MODE), new CalendarView.OnCalendarPageChanged() {\n            @Override\n            public void onPageChanged(CustomDate showDate) {\n                showTv.setText(showDate.year+\"年\"+showDate.month+\"月\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/DashBoardActivity.java",
    "content": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\n\nimport com.palmwifi.testcal.dash.DashboardView;\n\n/**\n * Created by David on 2017/4/13.\n */\n\npublic class DashBoardActivity extends AppCompatActivity {\n\n    private DashboardView tempDashView;\n    private DashboardView humDashView;\n    private final static int invs[] = {35, 10, 35};\n    private final static int[] colorRes = {R.color.arc1, R.color.arc2, R.color.arc3};\n    private final static int invs1[] = {25, 50, 25};\n    private final static int[] colorRes1 = {R.color.arc21, R.color.arc22, R.color.arc23};\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.ac_dash_broad);\n        tempDashView = (DashboardView) findViewById(R.id.temp);\n        humDashView = (DashboardView) findViewById(R.id.humi);\n        String[] str = getResources().getStringArray(R.array.mult_temp_dash);\n        String[] str2 = getResources().getStringArray(R.array.mult_huim_dash);\n        tempDashView.initDash(-20, invs, str, \"℃\", colorRes);\n        humDashView.initDash(0, invs1, str2, \"%\", colorRes1);\n        tempDashView.setAngleWithAnim(30);\n        humDashView.setAngleWithAnim(70);\n\n\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/HomeActivity.java",
    "content": "package com.palmwifi.testcal;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\n\n/**\n * Created by David on 2017/5/10.\n */\n\npublic class HomeActivity extends AppCompatActivity implements View.OnClickListener {\n\n\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.ac_home);\n        findViewById(R.id.btn_new_month_cal).setOnClickListener(this);\n        findViewById(R.id.btn_new_week_cal).setOnClickListener(this);\n        findViewById(R.id.btn_cal).setOnClickListener(this);\n        findViewById(R.id.btn_round_board).setOnClickListener(this);\n        findViewById(R.id.btn_dash_board).setOnClickListener(this);\n        findViewById(R.id.btn_dash_board).setOnClickListener(this);\n    }\n\n    @Override\n    public void onClick(View v) {\n        Intent i = null;\n        switch (v.getId()){\n            case R.id.btn_new_month_cal:\n                i = new Intent(this,CalendarMonthActivity.class); //日历\n                break;\n            case R.id.btn_new_week_cal:\n                i = new Intent(this,CalendarWeekActivity.class); //日历\n                break;\n            case R.id.btn_cal:\n                i = new Intent(this,CalendarActivity.class); //日历\n                break;\n            case R.id.btn_dash_board:\n                i = new Intent(this,DashBoardActivity.class); //仪表盘\n                break;\n            case R.id.btn_round_board:\n                i = new Intent(this,RingActivity.class); //圆盘\n                break;\n\n        }\n        if(i  != null){\n            startActivity(i);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/RingActivity.java",
    "content": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\n\nimport com.palmwifi.testcal.dash.RingView;\n\n/**\n * Created by David on 2017/4/13.\n */\n\npublic class RingActivity extends AppCompatActivity {\n\n    private RingView tempDashView;\n\n    private RingView tempDashView2;\n\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.ac_ring);\n        tempDashView = (RingView) findViewById(R.id.humi);\n        String[] str = {\"差\", \"中\", \"好\"};\n        int[] colors = {R.color.arc1, R.color.arc2, R.color.arc3};\n        tempDashView.setTotalSection(3);\n        tempDashView.setSelectPosition(1);\n        tempDashView.initDash(str,colors);\n        tempDashView.startAnim(800);\n        tempDashView2 = (RingView) findViewById(R.id.humi2);\n        tempDashView2.setTotalSection(5);\n\n\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarMonthView.java",
    "content": "package com.palmwifi.testcal.calendar;\n\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\n\npublic class CalendarMonthView extends CalendarView {\n\n    private static final int TOTAL_COL = 7;\n    private static final int TOTAL_ROW = 6;\n\n    public static CustomDate mShowDate;\n    public static CustomDate mClickDate;\n    public static CustomDate mClickHideDate;\n    private OnCalenderListener mCallBack;\n\n\n    public CalendarMonthView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n    }\n\n    public CalendarMonthView(Context context, OnCalenderListener callBack) {\n        super(context);\n        this.mCallBack = callBack;\n        initDate();\n\n    }\n\n    public CalendarMonthView(Context context) {\n        super(context);\n        initDate();\n\n    }\n\n    @Override\n    protected void initDate() {\n        mShowDate = new CustomDate();\n        fillDate();\n    }\n\n\n    @Override\n    public void measureClickCell(int col, int row) {\n        if (col >= TOTAL_COL || row >= TOTAL_ROW)\n            return;\n        Cell cell = rows[row].cells[col];\n        if (cell == null || cell.state == State.PAST_MONTH_DAY || cell.state == State.NEXT_MONTH_DAY) {\n            return;\n        }\n        CustomDate date = cell.date;\n        mClickDate = date;\n        mClickHideDate = date;\n        fillMonthDate(false);\n        invalidate();\n    }\n\n\n    private void fillDate() {\n        fillMonthDate(true);\n    }\n\n\n    private void fillMonthDate(boolean isChangeClick) {\n\n        int monthDay = DateUtil.getCurrentMonthDay();\n        int lastMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month - 1);\n        int currentMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month);\n        int firstDayWeek = DateUtil.getWeekDayFromDate(mShowDate.year, mShowDate.month);\n        boolean isCurrentMonth = false;\n        if (DateUtil.isCurrentMonth(mShowDate)) {\n            isCurrentMonth = true;\n            if (isChangeClick) {\n                mClickHideDate = CustomDate.modifiDayForObject(mShowDate, monthDay, 0);\n                mClickDate = CustomDate.modifiDayForObject(mShowDate, monthDay, 0);\n            }\n\n        } else {\n            if (isChangeClick) {\n                if(isAutoClickFirstDay())\n                    mClickDate = CustomDate.modifiDayForObject(mShowDate, 1, 0);\n                    mClickHideDate = CustomDate.modifiDayForObject(mShowDate, monthDay, 0);\n            }\n        }\n        int day = 0;\n        for (int j = 0; j < TOTAL_ROW; j++) {\n            rows[j] = new Row(j);\n            for (int i = 0; i < TOTAL_COL; i++) {\n                int position = i + j * TOTAL_COL;\n                CustomDate date;\n                if (position >= firstDayWeek && position < firstDayWeek + currentMonthDays) {\n                    day++;\n                    if (day == currentMonthDays) {\n                        int maxRow = j + 1;\n                        if (mCallBack != null)\n                            mCallBack.changeRowCount(maxRow);\n                    }\n                    date = CustomDate.modifiDayForObject(mShowDate, day, i);\n                    RecordState state = getRecordDateState(date);\n                    if (date.isSameDay(mClickDate)) {\n                        mClickDate.setWeek(i);\n                        if (mCallBack != null)\n                            mCallBack.clickDate(date);\n                        updateCellData(j, i, date, State.CLICK_DAY, state);\n                        continue;\n                    }\n                    if(date.isSameDay(mClickHideDate)){\n                        mClickHideDate.setWeek(i);\n                        if (mCallBack != null)\n                            mCallBack.showDate(date);\n                    }\n                    if (isCurrentMonth && day == monthDay) {\n                        updateCellData(j, i, date, State.TODAY, state);\n                        continue;\n                    }\n                    updateCellData(j, i, date, State.CURRENT_MONTH_DAY, state);\n                } else if (position < firstDayWeek) {\n                    date = new CustomDate(mShowDate.year, mShowDate.month - 1, lastMonthDays - (firstDayWeek - position - 1), i);\n                    updateCellData(j, i, date, State.PAST_MONTH_DAY, RecordState.Unkown);\n                } else if (position >= firstDayWeek + currentMonthDays) {\n                    date = new CustomDate(mShowDate.year, mShowDate.month + 1, position - firstDayWeek - currentMonthDays + 1, i);\n                    updateCellData(j, i, date, State.NEXT_MONTH_DAY, RecordState.Unkown);\n                }\n            }\n        }\n    }\n\n\n    @Override\n    public void update() {\n        fillMonthDate(false);\n\n        invalidate();\n    }\n\n    @Override\n    public void backToday() {\n        initDate();\n        invalidate();\n    }\n\n    @Override\n    public void update(CustomDate showDate, CustomDate clickDate) {\n\n        mShowDate = showDate;\n        mClickDate = clickDate;\n        mClickHideDate = clickDate;\n        fillMonthDate(false);\n        invalidate();\n    }\n\n    @Override\n    public CustomDate getClickDate() {\n        return mClickDate;\n    }\n\n\n    @Override\n    public RecordState getRecordDateState(CustomDate date) {\n        RecordState state = null;\n        if (mCallBack != null) {\n            state = mCallBack.setSignDateStatus(date);\n        }\n        return state != null ? state : RecordState.UnSign;\n    }\n\n\n\n    public void rightSlide() {\n        if (mShowDate.month == 12) {\n            mShowDate.month = 1;\n            mShowDate.year += 1;\n        } else {\n            mShowDate.month += 1;\n        }\n\n        fillDate();\n        invalidate();\n    }\n\n    public void leftSlide() {\n        if (mShowDate.month == 1) {\n            mShowDate.month = 12;\n            mShowDate.year -= 1;\n        } else {\n            mShowDate.month -= 1;\n        }\n\n        fillDate();\n        invalidate();\n    }\n\n\n    public void setOnCalenderListener(OnCalenderListener callBack) {\n        this.mCallBack = callBack;\n    }\n\n    @Override\n    public OnCalenderListener getOnCalenderListener() {\n        return mCallBack;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarView.java",
    "content": "package com.palmwifi.testcal.calendar;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.support.v4.content.ContextCompat;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\n\nimport com.palmwifi.testcal.R;\n\n\npublic abstract class CalendarView extends View {\n\n\n    public static final int TOTAL_COL = 7;\n    public static final int TOTAL_ROW = 6;\n    private Paint mCirclePaint;\n    private Paint mTextPaint;\n    private Paint mRectPaint;\n    private int mCellSpace;\n    private int mCellSpaceY;\n    public Row rows[] = new Row[TOTAL_ROW];\n    private int touchSlop;\n    private boolean callBackCellSpace;\n    public static CustomDate NowDate = new CustomDate();\n    private boolean isNeedShowClickDay = true;\n    private boolean isAutoClickFirstDay= true;\n\n    public CalendarView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init(context);\n    }\n\n    public CalendarView(Context context) {\n        super(context);\n        init(context);\n\n    }\n\n    public abstract void update();\n\n    public abstract void backToday();\n\n    public abstract void update(CustomDate showDate, CustomDate clickDate);\n\n    public abstract CustomDate getClickDate();\n\n\n    public abstract RecordState getRecordDateState(CustomDate date);\n\n\n    public abstract void rightSlide();\n\n    public abstract void leftSlide();\n\n    public abstract void setOnCalenderListener(OnCalenderListener callBack);\n\n    protected abstract void measureClickCell(int col, int row);\n\n    public abstract OnCalenderListener getOnCalenderListener();\n\n    protected abstract void initDate();\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        for (int i = 0; i < TOTAL_ROW; i++) {\n            if (rows[i] != null) {\n                rows[i].drawCells(canvas);\n            }\n        }\n    }\n\n    private void init(Context context) {\n        mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();\n        mCellSpaceY = getResources().getDimensionPixelOffset(R.dimen.calendar_view_height);\n        mCirclePaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_sign_color));\n\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        int mViewWidth = w;\n        mCellSpace = mViewWidth / TOTAL_COL;\n        if (!callBackCellSpace) {\n            if (getOnCalenderListener() != null)\n                getOnCalenderListener().onMeasureCellHeight(mCellSpaceY);\n            callBackCellSpace = true;\n        }\n        mTextPaint.setTextSize(mCellSpace / 3);\n    }\n\n    private float mDownX;\n    private float mDownY;\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mDownX = event.getX();\n                mDownY = event.getY();\n                break;\n            case MotionEvent.ACTION_UP:\n                float disX = event.getX() - mDownX;\n                float disY = event.getY() - mDownY;\n                if (Math.abs(disX) < touchSlop && Math.abs(disY) < touchSlop) {\n                    int col = (int) (mDownX / mCellSpace);\n                    int row = (int) (mDownY / mCellSpaceY);\n                    measureClickCell(col, row);\n                }\n                break;\n        }\n        return true;\n    }\n\n    class Row {\n        public int j;\n\n        Row(int j) {\n            this.j = j;\n        }\n\n        public Cell[] cells = new Cell[TOTAL_COL];\n\n        public void drawCells(Canvas canvas) {\n            for (int i = 0; i < cells.length; i++) {\n                if (cells[i] != null) {\n                    Cell nextCell = null;\n                    Cell perCell = null;\n                    if(i+1 < cells.length){\n                        nextCell = cells[i+1];\n                    }\n                    if(i -1 >= 0){\n                        perCell = cells[i-1];\n                    }\n                    cells[i].drawSelf(canvas,perCell,nextCell);\n                }\n            }\n\n        }\n    }\n\n\n    class Cell {\n        public CustomDate date;\n        public State state;\n        public RecordState recordState;\n        public int i;\n        public int j;\n\n        public Cell(CustomDate date, State state, RecordState recordState, int i, int j) {\n            this.date = date;\n            this.state = state;\n            this.i = i;\n            this.j = j;\n            this.recordState = recordState;\n        }\n\n        public void update(CustomDate date, State state, RecordState recordState) {\n            this.date = date;\n            this.state = state;\n            this.recordState = recordState;\n        }\n\n        public void drawSelf(Canvas canvas,Cell perCell,Cell nextCell) {\n            if (state == State.NEXT_MONTH_DAY || state == State.PAST_MONTH_DAY) {\n                return;\n            }\n            boolean isSign = false;\n            mTextPaint.setColor(ContextCompat.getColor(getContext(), R.color.drak_calendar_text_color));\n            switch (recordState) {\n                case Sign:\n                    mRectPaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_sign_color));\n                    mTextPaint.setColor(Color.WHITE);\n                    isSign = true;\n                    mCirclePaint.setColor(mRectPaint.getColor());\n                    break;\n                case Buckle:\n                    mRectPaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_buckle_color));\n                    mCirclePaint.setColor(mRectPaint.getColor());\n                    mTextPaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_buckle_text_color));\n                    break;\n                case UnSign:\n                    mCirclePaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_safe_color));\n                    mRectPaint.setColor(Color.TRANSPARENT);\n                    break;\n                case Unkown:\n                    mCirclePaint.setColor(Color.TRANSPARENT);\n                    mRectPaint.setColor(Color.TRANSPARENT);\n                    break;\n            }\n            float x = (float) (mCellSpace * (i + 0.5));\n            float y = (float) ((j + 0.5) * mCellSpaceY);\n            String content = date.day + \"\";\n            int radius = mCellSpace / 2 - 20;\n            boolean isNeedRect = (isSign && i != 6 && nextCell != null && (nextCell.state == State.CURRENT_MONTH_DAY\n                    ||nextCell.state == State.CLICK_DAY ||nextCell.state == State.TODAY)\n                    && nextCell.recordState == RecordState.Sign);\n            if(isNeedRect){\n                canvas.drawRect(x,y-radius,x+mCellSpace,y+radius,mRectPaint);\n            }\n            switch (state) {\n                case CURRENT_MONTH_DAY:\n                    canvas.drawCircle(x, y, radius, mRectPaint);\n                    break;\n                case TODAY:\n                    canvas.drawCircle(x, y, radius, mRectPaint);\n                    if(isNeedShowClickDay) {\n                        content = \"今\";\n                    }\n                    break;\n                case CLICK_DAY:\n                    if(isNeedShowClickDay){\n                        mTextPaint.setColor(ContextCompat.getColor(getContext(), R.color.base_black_title_color));\n                        mCirclePaint.setStyle(Paint.Style.STROKE);\n                        mCirclePaint.setStrokeWidth(4);\n                        if (date.isSameDay(NowDate)) {\n                            content = \"今\";\n                        }\n                        if(isSign){\n                            mRectPaint.setColor(Color.WHITE);\n                            canvas.drawCircle(x, y, radius, mRectPaint);\n                        }\n                        canvas.drawCircle(x, y, radius, mCirclePaint);\n                    }else{\n                        canvas.drawCircle(x, y, radius, mRectPaint);\n                    }\n                    break;\n                default:\n                    canvas.drawCircle(x, y, radius, mRectPaint);\n                    break;\n            }\n            canvas.drawText(content, x - mTextPaint.measureText(content) / 2, y + mTextPaint.measureText(\"1\", 0, 1) * 2 / 3, mTextPaint);\n        }\n    }\n\n    protected void updateCellData(int row, int col, CustomDate date, State state, RecordState mState) {\n        if (rows[row].cells[col] != null) {\n            rows[row].cells[col].update(date, state, mState);\n        } else {\n            rows[row].cells[col] = new Cell(date, state, mState, col, row);\n        }\n\n    }\n\n\n    enum State {\n        CURRENT_MONTH_DAY, TODAY, CLICK_DAY, PAST_MONTH_DAY, NEXT_MONTH_DAY;\n    }\n\n    public boolean isAutoClickFirstDay() {\n        return isAutoClickFirstDay;\n    }\n\n    public void setAutoClickFirstDay(boolean autoClickFirstDay) {\n        isAutoClickFirstDay = autoClickFirstDay;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewBuilder.java",
    "content": "package com.palmwifi.testcal.calendar;\n\nimport android.content.Context;\n\n\npublic class CalendarViewBuilder {\n\n\n\tpublic static CalendarView[] createMonthCalendarViews(Context context,\n\t\t\tint count, OnCalenderListener onCalenderListener) {\n\t\treturn createMonthCalendarViews(context,count,true,onCalenderListener);\n\t}\n\n\tpublic static CalendarView[] createMonthCalendarViews(Context context,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  int count,boolean isAutoClickFirstDay, OnCalenderListener onCalenderListener) {\n\t\tCalendarView[] calendarViews = new CalendarView[count];\n\t\tfor (int i = 0; i < count; i++) {\n\n\t\t\tcalendarViews[i] = new CalendarMonthView(context,onCalenderListener);\n\t\t\tcalendarViews[i].setAutoClickFirstDay(isAutoClickFirstDay);\n\t\t}\n\t\treturn calendarViews;\n\t}\n\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerAdapter.java",
    "content": "package com.palmwifi.testcal.calendar;\n\nimport android.os.Parcelable;\nimport android.support.v4.view.PagerAdapter;\nimport android.support.v4.view.ViewPager;\nimport android.view.View;\nimport android.view.ViewGroup;\n\npublic class CalendarViewPagerAdapter<V extends View> extends PagerAdapter {\n\t\n\tprivate V[] views;\n\n\t\n\tpublic CalendarViewPagerAdapter(V[] views) {\n\t\tsuper();\n\t\tthis.views = views;\n\t}\n\n\t@Override\n\tpublic void finishUpdate(View arg0) {\n\t}\n\n\t@Override\n\tpublic void notifyDataSetChanged() {\n\t\tsuper.notifyDataSetChanged();\n\t}\n\n\t@Override\n\tpublic int getCount() {\n\t\treturn Integer.MAX_VALUE;\n\t}\n\n\t@Override\n\tpublic Object instantiateItem(View arg0, int arg1) {\n\t\tView childView = views[arg1 % views.length];\n\t\tif(childView.getParent() != null){\n\t\t\t((ViewGroup)childView.getParent()).removeView(childView);\n\t\t}\n\t\t((ViewPager) arg0).addView(childView, 0);\n\n\t\treturn childView;\n\t}\n\n\t@Override\n\tpublic boolean isViewFromObject(View arg0, Object arg1) {\n\t\treturn arg0 == (arg1);\n\t}\n\n\t@Override\n\tpublic Parcelable saveState() {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic void destroyItem(View arg0, int arg1, Object arg2) {\n\t\t// TODO Auto-generated method stub\n\n\t}\n\n\t@Override\n\tpublic void startUpdate(View arg0) {\n\t}\n\n\t\n\tpublic V[] getAllItems() {\n\t\treturn views;\n\t}\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerListener.java",
    "content": "package com.palmwifi.testcal.calendar;\n\n\nimport android.support.v4.view.ViewPager;\nimport android.support.v4.view.ViewPager.OnPageChangeListener;\n\npublic class CalendarViewPagerListener implements OnPageChangeListener {\n\n\tprivate SlideDirection mDirection = SlideDirection.NO_SILDE;\n\tint mCurrIndex = 498;\n\tprivate CalendarView[] mShowViews;\n\tprivate ViewPager mPager;\n\tprivate boolean isAutoClickFristDay = true;\n\n\tpublic CalendarViewPagerListener(ViewPager viewPager, CalendarViewPagerAdapter<CalendarView> viewAdapter) {\n\t\tthis.mShowViews = viewAdapter.getAllItems();\n\t\tthis.mPager = viewPager;\n\t}\n\n\t@Override\n\tpublic void onPageSelected(int arg0) {\n\t\tmeasureDirection(arg0);\n\t\tupdateCalendarView(arg0);\n\t}\n\n\tprivate void updateCalendarView(int arg0) {\n\t\tCalendarView calendar = mShowViews[arg0 % mShowViews.length];\n\t\tif(mDirection == SlideDirection.RIGHT){\n\t\t\tcalendar.rightSlide();\n\t\t}else if(mDirection == SlideDirection.LEFT){\n\t\t\tcalendar.leftSlide();\n\t\t}\n\t\tmDirection = SlideDirection.NO_SILDE;\n\t}\n\n\t\n\n\tprivate void measureDirection(int arg0) {\n\n\t\tif (arg0 > mCurrIndex) {\n\t\t\tmDirection = SlideDirection.RIGHT;\n\n\t\t} else if (arg0 < mCurrIndex) {\n\t\t\tmDirection = SlideDirection.LEFT;\n\t\t}\n\t\tmCurrIndex = arg0;\n\t}\n\n\t@Override\n\tpublic void onPageScrolled(int arg0, float arg1, int arg2) {\n\t}\n\n\t@Override\n\tpublic void onPageScrollStateChanged(int arg0) {\n\t}\n\n\t\n\n\t\n\tpublic CalendarView getCurrentCalendar(){\n\t\treturn mShowViews[mPager.getCurrentItem() % mShowViews.length];\n\t\t\n\t}\n\n\t\n\tpublic void updateCalendar(){\n\t\tCalendarView calendar = mShowViews[mPager.getCurrentItem() % mShowViews.length];\n\t\tcalendar.update();\n\t}\n\t\n\tpublic void backToday(){\n\t\tCalendarView calendar = mShowViews[mPager.getCurrentItem() % mShowViews.length];\n\t\tcalendar.backToday();\n\t}\n\t\n\n\n\tenum SlideDirection {\n\t\tRIGHT, LEFT, NO_SILDE;\n\t}\n}"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/CustomDate.java",
    "content": "package com.palmwifi.testcal.calendar;\n\nimport java.io.Serializable;\n\npublic class CustomDate implements Serializable,Comparable<CustomDate>{\n\t\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tpublic int year;\n\tpublic int month;\n\tpublic int day;\n\tpublic int week;\n\t\n\tpublic CustomDate(int year,int month,int day,int week){\n\t\tif(month > 12){\n\t\t\tmonth = 1;\n\t\t\tyear++;\n\t\t}else if(month <1){\n\t\t\tmonth = 12;\n\t\t\tyear--;\n\t\t}\n\t\tthis.year = year;\n\t\tthis.month = month;\n\t\tthis.day = day;\n\t\tthis.week = week;\n\t}\n\t\n\tpublic CustomDate(int year,int month,int day){\n\t\tif(month > 12){\n\t\t\tmonth = 1;\n\t\t\tyear++;\n\t\t}else if(month <1){\n\t\t\tmonth = 12;\n\t\t\tyear--;\n\t\t}\n\t\tthis.year = year;\n\t\tthis.month = month;\n\t\tthis.day = day;\n\t}\n\t\n\tpublic CustomDate(){\n\t\tthis.year = DateUtil.getYear();\n\t\tthis.month = DateUtil.getMonth();\n\t\tthis.day = DateUtil.getCurrentMonthDay();\n\t\tthis.week = DateUtil.getWeekDay();\n\t}\n\t\n\tpublic static CustomDate modifiDayForObject(CustomDate date,int day,int week){\n\t\tCustomDate modifiDate = new CustomDate(date.year,date.month,day,week);\n\t\treturn modifiDate;\n\t}\n\n\n\tpublic int getYear() {\n\t\treturn year;\n\t}\n\n\tpublic void setYear(int year) {\n\t\tthis.year = year;\n\t}\n\n\tpublic int getMonth() {\n\t\treturn month;\n\t}\n\n\tpublic void setMonth(int month) {\n\t\tthis.month = month;\n\t}\n\n\tpublic int getDay() {\n\t\treturn day;\n\t}\n\n\tpublic void setDay(int day) {\n\t\tthis.day = day;\n\t}\n\t\n\t\n\tpublic boolean isSameDay(CustomDate customDate){\n\t\treturn year == customDate.year&& customDate.month == month && day == customDate.day;\n\t}\n\n\tpublic int getWeek() {\n\t\treturn week;\n\t}\n\n\tpublic void setWeek(int week) {\n\t\tthis.week = week;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn year+\"-\"+month+\"-\"+day;\n\t}\n\n\n\t@Override\n\tpublic int compareTo(CustomDate another) {\n\tif(another != null){\n\t\tif(this.year >another.year){\n\t\t\treturn 1;\n\t\t}else if(this.year  == another.year && this.month > another.month){\n\t\t\treturn 1;\n\t\t}else if(this.year  == another.year && this.month == another.month && this.day >another.day){\n\t\t\treturn 1;\n\t\t}else if(this.year  == another.year && this.month == another.month && this.day == another.day){\n\t\t\treturn 0;\n\t\t}\n\t\treturn -1;\n\t}\n\t\treturn -1;\n\t}\n\n\t\n\tpublic int compareDays(CustomDate another){\n\t\tif(this.month == another.month){\n\t\t\treturn this.day - another.day;\n\t\t}else{\n\t\t\tint days = DateUtil.getMonthDays(another.year,another.month);\n\t\t\treturn days - another.day + this.day;\n\t\t}\n\t}\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/DateUtil.java",
    "content": "package com.palmwifi.testcal.calendar;\n\nimport android.annotation.SuppressLint;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.Date;\n\n\npublic class DateUtil {\n\n\tpublic static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\"yyyyMMdd\");\n\n\tpublic static int getMonthDays(int year, int month) {\n\t\tif (month > 12) {\n\t\t\tmonth = 1;\n\t\t\tyear += 1;\n\t\t} else if (month < 1) {\n\t\t\tmonth = 12;\n\t\t\tyear -= 1;\n\t\t}\n\t\tint[] arr = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\n\t\tint days = 0;\n\n\t\tif ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {\n\t\t\tarr[1] = 29; \n\t\t}\n\n\t\ttry {\n\t\t\tdays = arr[month - 1];\n\t\t} catch (Exception e) {\n\t\t\te.getStackTrace();\n\t\t}\n\n\t\treturn days;\n\t}\n\t\n\tpublic static int getYear() {\n\t\treturn Calendar.getInstance().get(Calendar.YEAR);\n\t}\n\n\tpublic static int getMonth() {\n\t\treturn Calendar.getInstance().get(Calendar.MONTH) + 1;\n\t}\n\n\tpublic static int getCurrentMonthDay() {\n\t\treturn Calendar.getInstance().get(Calendar.DAY_OF_MONTH);\n\t}\n\n\tpublic static int getWeekDay() {\n\t\treturn Calendar.getInstance().get(Calendar.DAY_OF_WEEK);\n\t}\n\n\tpublic static int getHour() {\n\t\treturn Calendar.getInstance().get(Calendar.HOUR_OF_DAY);\n\t}\n\tpublic static int getMinute() {\n\t\treturn Calendar.getInstance().get(Calendar.MINUTE);\n\t}\n\n\n\n\n\tpublic static int getWeekDayFromDate(int year, int month) {\n\t\tCalendar cal = Calendar.getInstance();\n\t\tcal.setTime(getDateFromString(year, month));\n\t\tint week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;\n\t\tif (week_index < 0) {\n\t\t\tweek_index = 0;\n\t\t}\n\t\treturn week_index;\n\t}\n\n\t@SuppressLint(\"SimpleDateFormat\")\n\tpublic static Date getDateFromString(int year, int month) {\n\t\tString dateString = year + \"-\" + (month > 9 ? month : (\"0\" + month))\n\t\t\t\t+ \"-01\";\n\t\tDate date = null;\n\t\ttry {\n\t\t\tSimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd\");\n\t\t\tdate = sdf.parse(dateString);\n\t\t} catch (ParseException e) {\n\t\t\tSystem.out.println(e.getMessage());\n\t\t}\n\t\treturn date;\n\t}\n\tpublic static boolean isToday(CustomDate date){\n\t\treturn(date.year == DateUtil.getYear() &&\n\t\t\t\tdate.month == DateUtil.getMonth() \n\t\t\t\t&& date.day == DateUtil.getCurrentMonthDay());\n\t}\n\t\n\tpublic static boolean isCurrentMonth(CustomDate date){\n\t\treturn(date.year == DateUtil.getYear() &&\n\t\t\t\tdate.month == DateUtil.getMonth());\n\t}\n\t\n\tpublic static int betweenDays(CustomDate date, CustomDate compareDate){\n\t\tint dayCount = 0;\n\t\ttry {\n\t\t\tDate date1 = simpleDateFormat.parse(date.year+(date.month<10?\"0\"+date.month :\"\"+date.month)+\"\"+(date.day<10?\"0\"+date.day:\"\"+date.day));\n\t\t\tDate compareDate1 = simpleDateFormat.parse(compareDate.year+(compareDate.month<10?\"0\"+compareDate.month :\"\"+compareDate.month)+\"\"+(compareDate.day<10?\"0\"+compareDate.day:\"\"+compareDate.day));\n\t\t\tdayCount = (int) ((date1.getTime()-compareDate1.getTime())/(3600000*24));\n\t\t} catch (ParseException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn dayCount;\n\t}\n\t\n\t\n\n\t\n\tpublic static class State{\n\t\tpublic String  tip;\n\t\tpublic int day;\n\t\tpublic State(String tip, int day) {\n\t\t\tthis.tip = tip;\n\t\t\tthis.day = day;\n\t\t}\n\t\t\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/OnCalenderListener.java",
    "content": "package com.palmwifi.testcal.calendar;\n\n\npublic interface OnCalenderListener {\n\n\t void clickDate(CustomDate date);\n\n\t void showDate(CustomDate date);\n\n\t void onMeasureCellHeight(int cellSpace);\n\n\t\n\t void changeRowCount(int rows);\n\n\t RecordState setSignDateStatus(CustomDate date);\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/calendar/RecordState.java",
    "content": "package com.palmwifi.testcal.calendar;\n\n/**\n * Created by David on 2017/4/12.\n */\npublic enum RecordState {\n    //签到的\n    Sign,\n    //未签到\n    UnSign,\n    //扣除\n    Buckle,\n    //未知\n    Unkown;\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/dash/DashboardView.java",
    "content": "package com.palmwifi.testcal.dash;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Paint.Style;\nimport android.graphics.Path;\nimport android.graphics.RectF;\nimport android.graphics.Typeface;\nimport android.support.v4.content.ContextCompat;\nimport android.util.AttributeSet;\nimport android.view.View;\n\n\nimport com.palmwifi.testcal.R;\n\nimport java.text.DecimalFormat;\n\n/**\n * Created by David on 2016/11/10.\n */\n\npublic class DashboardView extends View {\n\n    public static final int MAX_AMIN_TIME = 400;\n    public static final int BORDER = 42;\n    public static final int CENTER_CIRCLE_RADIUS = 35;\n    public static final int TOTAL_ANGLE = 330;\n    public static final int GRADUATED_LINE_PADDING = 0; //刻度线\n    public static final int SCALE_VALUE_PADDING = 7; //刻度线\n    public static final int SCALE_INV = 10; //每隔间距10画一个值 默认\n    public static final int GRADUATED_INV = 2;//每隔间距2画一个刻度线 默认\n    public static final float LINE_PERCENT = 0.6f;\n    private Paint mArcPaint;\n    private Paint mInvPaint;\n    private Paint mTextPaint;\n    private Paint mLinePaint;\n    private int mTextHeight;\n    private Paint mIntervalsPaint;\n    private Paint mNumberPaint;\n    private Paint mCenterCirclePaint;\n    private int totalAngle = TOTAL_ANGLE;\n\n    private int[] intervals = {35, 10, 35};\n    private String[] intervalStr;\n    private int angle = 0;\n    private int startNum = 0;\n    private int[] colorRes = {R.color.arc1, R.color.arc2, R.color.arc3};\n    private int centerCircleRadius = CENTER_CIRCLE_RADIUS;\n    private int circleBorder = BORDER;\n    private int graduatedLineinv = GRADUATED_LINE_PADDING; //指针和线之间的间距\n    private int scaleValueinv = SCALE_VALUE_PADDING; //数字和指针的间距\n    private int graduatedLineLength = SCALE_VALUE_PADDING;//线的长度\n    private int tempAngle = 0;\n    private String unit = \"℃\";\n    private int animAngle = 5;\n    private int scaleValInv = SCALE_INV;\n    private int graduatedInv = GRADUATED_INV;\n    private float linePercent = LINE_PERCENT;\n    private float angleTextSize;\n    private float numberTextSize;\n    private float graduatedTextSize;\n    private int[] filterNumbers;\n    private String drawNumText;\n    public static DecimalFormat df = new DecimalFormat(\"#.0\");\n    private Path path;\n    private RectF oval;\n\n\n    public DashboardView(Context context) {\n        super(context);\n        initView();\n    }\n\n    public DashboardView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initAttr(attrs);\n        initView();\n    }\n\n    public DashboardView(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        initAttr(attrs);\n        initView();\n    }\n\n    private void initAttr(AttributeSet attrs) {\n\n        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.DashboardView);\n        totalAngle = a.getInteger(R.styleable.DashboardView_totalAngle, TOTAL_ANGLE);\n        centerCircleRadius = a.getDimensionPixelSize(R.styleable.DashboardView_centerCircleRadius, CENTER_CIRCLE_RADIUS);\n        circleBorder = a.getDimensionPixelSize(R.styleable.DashboardView_arcBorderDimen, BORDER);\n        angleTextSize = a.getDimension(R.styleable.DashboardView_angleTextSize, 25);\n        numberTextSize = a.getDimension(R.styleable.DashboardView_numberTextSize, 25);\n        graduatedTextSize = a.getDimension(R.styleable.DashboardView_graduatedTextSize, 25);\n        linePercent = a.getFloat(R.styleable.DashboardView_pointLinePercent, 0.6f);\n        a.recycle();\n    }\n\n\n   /* @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        int width = measure(widthMeasureSpec);\n        int height = measure(heightMeasureSpec);\n        int d = Math.min(width, height);\n        setMeasuredDimension(d, d);\n    }\n\n    protected int measure(int measureSpec) {\n        int size;\n        int measureMode = MeasureSpec.getMode(measureSpec);\n        if (measureMode == MeasureSpec.UNSPECIFIED) {\n            size = 250;\n        } else {\n            size = MeasureSpec.getSize(measureSpec);\n        }\n        return size;\n\n    }*/\n\n    protected void initView() {\n\n\n        mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mArcPaint.setAntiAlias(true);\n        mArcPaint.setStrokeWidth(circleBorder);\n        mArcPaint.setStyle(Style.STROKE);\n        mArcPaint.setStrokeCap(Paint.Cap.ROUND);\n\n        mInvPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mInvPaint.setAntiAlias(true);\n        mInvPaint.setStrokeWidth(circleBorder + 1);\n        mInvPaint.setColor(Color.WHITE);\n        mInvPaint.setStyle(Style.STROKE);\n\n        mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mTextPaint.setColor(getResources().getColor(R.color.arc_text));\n        mTextPaint.setTextSize(numberTextSize);\n        mTextPaint.setTypeface(Typeface.DEFAULT);\n\n        mIntervalsPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mIntervalsPaint.setColor(Color.WHITE);\n        mIntervalsPaint.setTextSize(graduatedTextSize);\n        mIntervalsPaint.setTypeface(Typeface.DEFAULT);\n        mNumberPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mNumberPaint.setColor(getResources().getColor(R.color.arc_temp));\n        mNumberPaint.setTextSize(angleTextSize);\n        mNumberPaint.setTypeface(Typeface.DEFAULT);\n\n        mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mLinePaint.setStrokeWidth(3f);\n        mLinePaint.setStyle(Style.FILL);\n        mLinePaint.setColor(getResources().getColor(R.color.arc_line));\n\n        mCenterCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mCenterCirclePaint.setAntiAlias(true);\n        mCenterCirclePaint.setStrokeWidth(4f);\n        mCenterCirclePaint.setColor(getResources().getColor(R.color.arc_line));\n        mCenterCirclePaint.setStyle(Style.STROKE);\n        path = new Path();\n        mTextHeight = (int) mLinePaint.measureText(\"NN\");\n\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        int px = getMeasuredWidth() / 2;\n        int py = getMeasuredHeight() / 2;\n        int maxRadius = Math.min(px, py);\n        py = maxRadius;\n        int x = maxRadius / 10;\n        int realRadius = maxRadius - x;\n        if(oval == null) {\n            oval= new RectF(x + (px - py), maxRadius / 10, maxRadius * 2 - x + (px - py), maxRadius * 2 - x);\n        }\n        if (px > py) {\n            px = (px - py) + maxRadius;\n        }\n        float totalScores = 0f;\n        for (int s : intervals) {\n            totalScores += s;\n        }\n        float perAngle = totalAngle / totalScores;\n        int startAngle = (360 - totalAngle) / 2 + 90;\n        for (int i = 0; i < intervals.length; i++) {\n            mArcPaint.setColor(ContextCompat.getColor(getContext(),i < colorRes.length ? colorRes[i] : colorRes[0]));\n            int sweepAngle = (int) (perAngle * intervals[i]);\n            canvas.drawArc(oval, startAngle, sweepAngle, false, mArcPaint);\n            startAngle += sweepAngle;\n            mArcPaint.setColor(Color.WHITE);\n            if (i != 0) {\n                canvas.drawArc(oval, startAngle - sweepAngle - 5, 5, false, mInvPaint);\n            }\n        }\n        canvas.drawCircle(px, py, centerCircleRadius, mCenterCirclePaint);\n        String text = (drawNumText != null ? drawNumText : angle) + unit;\n        canvas.drawText(text, px - (text.length() > 3 ?mTextHeight*3 :mTextHeight), 2 * maxRadius - mTextHeight + 6, mNumberPaint);\n        canvas.save();\n        canvas.rotate(-totalAngle / 2, px, py);\n        int invPos = 0;\n        int inv = startNum;\n        int graduatedLineY = py - realRadius + circleBorder - graduatedLineLength;\n        for (int i = startNum; i <= totalScores + startNum; i++) {\n            canvas.save();\n            if (i % scaleValInv == 0) {\n                boolean isDraw = true;\n                if (filterNumbers != null) {\n                    ok:\n                    for (int n : filterNumbers) {\n                        if (n == i) {\n                            isDraw = false;\n                            break ok;\n                        }\n                    }\n                }\n                if (isDraw) {\n                    canvas.drawText(i + \"\", px - mTextHeight + 6, graduatedLineY + scaleValueinv + graduatedLineLength + graduatedLineinv +\n                            mTextHeight, mTextPaint);//方位\n                }\n            }\n            if (i % graduatedInv == 0) {\n                canvas.drawLine(px, graduatedLineY, px, graduatedLineY + graduatedLineLength, mLinePaint);\n            }\n            if (i == angle) {\n                canvas.drawLine(px, py - centerCircleRadius, px, (int) (py - maxRadius * linePercent), mCenterCirclePaint);\n            }\n            if (intervalStr != null && invPos < intervals.length) {\n                if (i - 1 == inv + intervals[invPos] / 2) {\n                    path.reset();\n                    path.addArc(oval,-90- (intervalStr[invPos].length() >5 ? 20:10),180);\n                    boolean isReduce = false;\n                    if(intervalStr[invPos].length() >5 ){\n                        mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() -5);\n                        isReduce = true;\n                    }\n                    canvas.drawTextOnPath(intervalStr[invPos], path, 0, circleBorder / 2 - mTextHeight / 2 + 6, mIntervalsPaint);\n                    if(isReduce){\n                        mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() +5);\n                    }\n                    inv += intervals[invPos];\n                    invPos++;\n                }\n            }\n            canvas.restore();\n            canvas.rotate(perAngle, px, py);\n\n        }\n        canvas.restore();\n    }\n\n    public int getAngle() {\n        return angle;\n    }\n\n    public void setAngle(int angle) {\n        this.angle = angle;\n        invalidate();\n    }\n\n    public void setAngleWithAnim(int angle) {\n        if (angle == startNum) {\n            this.angle = angle;\n            invalidate();\n            return;\n        }\n        tempAngle = angle;\n        animAngle = 5;\n        post(animAngleRunnable);\n    }\n\n    public void setAngleWithAnim(double angle) {\n        drawNumText =  df.format(angle);\n        setAngleWithAnim((int)angle);\n    }\n\n\n\n    private Runnable animAngleRunnable = new Runnable() {\n\n\n        @Override\n        public void run() {\n            if (tempAngle > angle) {\n                angle += animAngle;\n                if (angle > tempAngle) {\n                    angle = tempAngle;\n                    tempAngle = 0;\n                }\n            }\n            invalidate();\n            postDelayed(this, 50);\n        }\n    };\n\n    /**\n     * 初始化\n     *\n     * @param startNum     开始的值\n     * @param eachInterval 每个区 间隔\n     */\n    public void initDash(int startNum, int[] eachInterval, String[] intervalStrs) {\n\n        initDash(startNum, eachInterval, intervalStrs, null, null);\n    }\n\n\n    public void initDash(int startNum, int[] eachInterval, String[] intervalStrs, String unit, int[] colors) {\n\n        initDash(startNum, eachInterval, intervalStrs, unit, colors, null);\n    }\n\n    /**\n     * 初始化\n     *\n     * @param startNum     开始的值\n     * @param eachInterval 每个区 间隔\n     * @param colors       区间 颜色值\n     */\n    public void initDash(int startNum, int[] eachInterval, String[] intervalStrs, String unit, int[] colors, int[] filterNumbers) {\n\n        this.startNum = startNum;\n        intervals = eachInterval;\n        if (colorRes != null) {\n            this.colorRes = colors;\n        }\n        this.intervalStr = intervalStrs;\n        if (unit != null) {\n            this.unit = unit;\n        }\n        if (filterNumbers != null) {\n            this.filterNumbers = filterNumbers;\n        }\n        invalidate();\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/dash/RingView.java",
    "content": "package com.palmwifi.testcal.dash;\n\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Paint.Style;\nimport android.graphics.Path;\nimport android.graphics.Point;\nimport android.graphics.RadialGradient;\nimport android.graphics.RectF;\nimport android.graphics.Shader;\nimport android.graphics.Typeface;\nimport android.support.v4.content.ContextCompat;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.animation.DecelerateInterpolator;\n\n\nimport com.palmwifi.testcal.R;\n\n\n/**\n * Created by David on 2016/11/10.\n */\n\npublic class RingView extends View {\n\n    public static final int BORDER = 42;\n    public static final int TOTAL_ANGLE = 360;\n\n    private Paint mArcPaint;\n    private int mTextHeight;\n    private Paint mIntervalsPaint;\n    private Paint mCenterCirclePaint;\n    private int totalAngle = TOTAL_ANGLE;\n    private int totalSection = 3;\n    private String[] TextStrArray;\n    private int[] colorRes;\n    private int defaultColor;\n    private int bgColor;\n    private int selectTextColor;\n    private int unSelectTextColor;\n    private int circleBorder = BORDER;\n    private Point centerPoint;\n    private int centerRadius;\n    private float centerTextSize;\n    private int selectPosition;\n    private RectF oval;\n    private RectF oval2;\n    private int touchSlop;\n    private Path path;\n    private int tempTotalAngle;\n    private int animTime = 20;\n    private Paint mShadowPaint;\n    private boolean isAnim;\n    private OnDashItemClickListener itemClickListener;\n\n\n    public RingView(Context context) {\n        super(context);\n        initView();\n    }\n\n    public RingView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initAttr(attrs);\n        initView();\n    }\n\n    public RingView(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        initAttr(attrs);\n        initView();\n    }\n\n    private void initAttr(AttributeSet attrs) {\n\n        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.RingView);\n        defaultColor = a.getColor(R.styleable.RingView_arc_select_color, ContextCompat.getColor(getContext(), R.color.selectColor));\n        selectTextColor = a.getColor(R.styleable.RingView_arcSelectTextColor, Color.WHITE);\n        bgColor = a.getColor(R.styleable.RingView_arc_bg_color, ContextCompat.getColor(getContext(), R.color.arc_bg));\n        unSelectTextColor = a.getColor(R.styleable.RingView_arcTextColor, ContextCompat.getColor(getContext(), R.color.arc_text));\n        circleBorder = a.getDimensionPixelSize(R.styleable.RingView_arcBorder, BORDER);\n        centerTextSize = a.getDimension(R.styleable.RingView_arcTextSize, 25);\n        touchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();\n        a.recycle();\n    }\n\n\n    protected void initView() {\n\n\n        mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mArcPaint.setAntiAlias(true);\n        mArcPaint.setStrokeWidth(circleBorder);\n        mArcPaint.setStyle(Style.STROKE);\n        mArcPaint.setStrokeCap(Paint.Cap.BUTT);\n        mIntervalsPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mIntervalsPaint.setColor(Color.BLACK);\n        mIntervalsPaint.setTextSize(centerTextSize);\n        mIntervalsPaint.setTypeface(Typeface.DEFAULT);\n        mCenterCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        mCenterCirclePaint.setAntiAlias(true);\n        mCenterCirclePaint.setColor(bgColor);\n        mCenterCirclePaint.setStyle(Style.STROKE);\n        mTextHeight = (int) mIntervalsPaint.measureText(\"NN\");\n        mShadowPaint= new Paint(Paint.ANTI_ALIAS_FLAG); //初始化画笔，为后面阴影效果使用。\n        //mShadowPaint.setStyle(Style.STROKE);\n       // mShadowPaint.setStrokeWidth(5);\n        //mShadowPaint.setShadowLayer(10f, 5.0f, 5.0f, Color.parseColor(\"#f2f2f2\")); //设置阴影层，这是关键。\n\n        path = new Path();\n    }\n\n\n    private float mDownX;\n    private float mDownY;\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mDownX = event.getX();\n                mDownY = event.getY();\n                break;\n            case MotionEvent.ACTION_UP:\n            case MotionEvent.ACTION_MOVE:\n              /*  int  disX = (int) (event.getX() - mDownX);\n                int  disY = (int) (event.getY() - mDownY);\n                if (Math.abs(disX) < touchSlop && Math.abs(disY) < touchSlop) {*/\n                int clickX = (int) event.getX();\n                int clickY = (int) event.getY();\n                int x = clickX - centerPoint.x;\n                int y = clickY - centerPoint.y;\n                int z = (int) Math.sqrt(Math.pow(Math.abs(x), 2) + Math.pow(Math.abs(y), 2));\n                if (z >= centerRadius - circleBorder / 2 && z <= centerRadius + circleBorder + 20) {\n                    double angle = Math.abs(Math.toDegrees(Math.atan((event.getY() - centerPoint.y) / (event.getX() - centerPoint.x))));\n                    if (x >= 0 && y < 0) {\n                        angle = 90 - angle;\n                    } else if (x >= 0 && y >= 0) {\n                        angle = 90 + angle;\n                    } else if (x < 0 && y >= 0) {\n                        angle = 270 - angle;\n                    } else {\n                        angle = 270 + angle;\n                    }\n                    int selectPosition = (int) (angle / (totalAngle / totalSection));\n                    setSelectPosition(selectPosition);\n                }\n\n                /*}*/\n                break;\n        }\n        return true;\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n\n        float perAngle = totalAngle / totalSection;\n        float startAngle = -90;\n        if (centerPoint == null) {\n            int px = getMeasuredWidth() / 2;\n            int py = getMeasuredHeight() / 2;\n            int maxRadius = Math.min(px, py);\n            py = maxRadius;\n            int margin = maxRadius / 5;\n\n            if (px > py) {\n                px = (px - py) + maxRadius;\n            }\n            centerPoint = new Point(px, py);\n            oval = new RectF(margin + (px - py), margin, maxRadius * 2 - margin + (px - py), maxRadius * 2 - margin);\n            oval2 = new RectF(oval.left-circleBorder, oval.top -circleBorder,oval.right+circleBorder, oval.bottom+circleBorder);\n            centerRadius = maxRadius - margin;\n            float innerRadius = (centerRadius-circleBorder/2)/((float)(centerRadius + circleBorder));\n            float outRadius = (centerRadius+circleBorder/2)/((float)(centerRadius + circleBorder));\n            RadialGradient gradient = new RadialGradient(px,py,centerRadius+circleBorder,new int[]{0x00ffffff,0xffd4d4d4,0xffd4d4d4,0x00ffffff},new float[]{innerRadius- (1-outRadius)/3,innerRadius,outRadius,outRadius+(1-outRadius)/3}, Shader.TileMode.CLAMP);\n            mShadowPaint.setShader(gradient);\n        }\n\n        mCenterCirclePaint.setStrokeWidth(circleBorder);\n        if(!isAnim) {\n            canvas.drawArc(oval2, startAngle + perAngle * selectPosition, totalAngle, false, mShadowPaint);\n        }\n        canvas.drawArc(oval, startAngle +perAngle*selectPosition, totalAngle, false, mCenterCirclePaint);\n\n        for (int i = 0; i < totalSection; i++) {\n            if (i == selectPosition) {\n                int selectColor = (colorRes == null ? defaultColor : ContextCompat.getColor(getContext(), colorRes[i]));\n                mArcPaint.setColor(selectColor);\n                canvas.drawArc(oval, startAngle, perAngle, false, mArcPaint);\n\n            }else {\n                mArcPaint.setColor(ContextCompat.getColor(getContext(),R.color.arc_inteval));\n                canvas.drawArc(oval, startAngle, 0.5f, false, mArcPaint);\n            }\n            path.reset();\n            path.addArc(oval, startAngle+perAngle/2, perAngle);\n            mIntervalsPaint.setColor(i == selectPosition ? selectTextColor : unSelectTextColor);\n\n            if (TextStrArray != null) {\n                boolean isReduce = false;\n                if (TextStrArray[i].length() > 5) {\n                    mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() - 5);\n                    isReduce = true;\n                }\n                if (isReduce) {\n                    mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() + 5);\n                }\n                canvas.drawTextOnPath(TextStrArray[i], path, 0, circleBorder / 2 - mTextHeight / 2 + 6, mIntervalsPaint);\n            } else {\n                canvas.drawTextOnPath((i + 1) + \"\", path, 0, circleBorder / 2 - mTextHeight / 2, mIntervalsPaint);\n            }\n            startAngle += perAngle;\n        }\n    }\n\n\n\n    public void initDash(String[] intervalStrs, int[] colors) {\n        this.TextStrArray = intervalStrs;\n        this.colorRes = colors;\n\n    }\n\n\n    public void startAnim(final int anim) {\n        tempTotalAngle = totalAngle;\n        totalAngle =1;\n        isAnim = true;\n        ValueAnimator valueAnimator = ValueAnimator.ofInt(0,tempTotalAngle);\n        valueAnimator.setDuration(anim);\n        valueAnimator.setInterpolator(new DecelerateInterpolator());//减速差值器\n        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                totalAngle = (int) animation.getAnimatedValue();\n                if(totalAngle <1){\n                    totalAngle =1;\n\n                }\n             if(tempTotalAngle == totalAngle){\n                 isAnim = false;\n             }\n                invalidate();\n            }\n        });\n        valueAnimator.start();\n\n    }\n\n    public void start(final int anim) {\n\n        ValueAnimator valueAnimator = ValueAnimator.ofInt(0,totalSection);\n        valueAnimator.setDuration(anim);\n        valueAnimator.setRepeatCount(100);\n        valueAnimator.setRepeatMode(ValueAnimator.REVERSE);\n        //valueAnimator.setInterpolator(new DecelerateInterpolator());//减速差值器\n        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n            @Override\n            public void onAnimationUpdate(ValueAnimator animation) {\n                selectPosition = (int) animation.getAnimatedValue();\n                invalidate();\n            }\n        });\n        valueAnimator.start();\n\n    }\n\n\n    public void setOnDashItemClickListener(OnDashItemClickListener itemClickListener) {\n        this.itemClickListener = itemClickListener;\n    }\n\n\n    public void setSelectPosition(int selectPosition) {\n\n        if (this.selectPosition != selectPosition) {\n            this.selectPosition = selectPosition;\n            if (itemClickListener != null) {\n                itemClickListener.onItemClick(this, selectPosition);\n            }\n            invalidate();\n        }\n\n\n    }\n\n    public void setTotalSection(int totalSection) {\n        this.totalSection = totalSection;\n    }\n\n\n    public interface OnDashItemClickListener {\n\n        void onItemClick(RingView dashView, int position);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/newcalendar/CustomCalendarAdapter.java",
    "content": "package com.palmwifi.testcal.newcalendar;\n\n\nimport com.bin.david.calendar.CalendarAdapter;\nimport com.bin.david.calendar.CalendarView;\n\n/**\n * Created by huang on 2017/11/22.\n */\n\npublic class CustomCalendarAdapter extends CalendarAdapter {\n    private CustomTextDrawFormat format;\n\n    public CustomCalendarAdapter(int mode) {\n        super(mode);\n    }\n\n    public CustomCalendarAdapter() {\n    }\n\n    @Override\n    protected void decorateCalendarView(CalendarView calendarView) {\n        if(format == null){\n            format = new CustomTextDrawFormat(mContext);\n        }\n        calendarView.addDrawFormat(format);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/newcalendar/CustomTextDrawFormat.java",
    "content": "package com.palmwifi.testcal.newcalendar;\n\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.support.v4.content.ContextCompat;\n\nimport com.bin.david.calendar.CalendarView;\nimport com.bin.david.calendar.CustomDate;\nimport com.bin.david.calendar.DateUtil;\nimport com.bin.david.calendar.TextDrawFormat;\nimport com.palmwifi.testcal.R;\nimport com.palmwifi.testcal.utils.DensityUtils;\n\n/**\n * Created by huang on 2017/11/22.\n */\n\npublic class CustomTextDrawFormat extends TextDrawFormat {\n\n    public static final int TODAY =1;\n    public static final int CURRENT_MONTH_DAY = 2;\n    public static final int OTHER_MONTH_DAY = 4;\n    public static final int CLICK_DAY = 3;\n    private int progress = 100;\n    private CalendarView calendarView;\n\n\n\n    private Context mContext;\n\n    public CustomTextDrawFormat(Context context) {\n        this.mContext = context;\n        setDrawLunar(true);\n        setInterval(DensityUtils.dp2px(context,7));\n    }\n\n    private CustomDate clickDate;\n\n    @Override\n    public void onDrawBackground(Canvas canvas, int type, Rect rect, Paint paint) {\n        if(type == CLICK_DAY) {\n            paint.setStyle(Paint.Style.FILL);\n            paint.setColor(ContextCompat.getColor(mContext, R.color.selectColor));\n            int r = Math.min(rect.width(), rect.height()) / 2 *progress/100;\n            canvas.drawCircle(rect.centerX(), rect.centerY(), r, paint);\n        }\n    }\n\n    @Override\n    public void onDrawBefore(Canvas canvas, int type, Rect rect, Paint paint) {\n        if(type == CLICK_DAY){\n            paint.setColor(ContextCompat.getColor(mContext,android.R.color.white));\n        }else if(type == OTHER_MONTH_DAY){\n            paint.setColor(ContextCompat.getColor(mContext, R.color.cal_buckle_text_color));\n        }\n    }\n\n    @Override\n    public void onDrawLunarBefore(Canvas canvas, int type, Rect rect,int dayLevel,Paint paint) {\n        paint.setTextSize(DensityUtils.sp2px(mContext, 9));\n        if(type == CLICK_DAY) {\n            paint.setColor(ContextCompat.getColor(mContext,android.R.color.white));\n        }else{\n            if(dayLevel == TextDrawFormat.FESTIVAL){\n                paint.setColor(ContextCompat.getColor(mContext, R.color.arc1));\n            }else if(dayLevel == TextDrawFormat.SOLAR){\n                paint.setColor(ContextCompat.getColor(mContext, R.color.arc22));\n            }else {\n                paint.setColor(ContextCompat.getColor(mContext, R.color.arc_text));\n            }\n        }\n    }\n\n\n\n    @Override\n    public boolean isDraw(int type) {\n        return true;\n    }\n\n    @Override\n    public int getDateType(CalendarView calendarView, CalendarView.Cell cell) {\n\n        CustomDate showDate = calendarView.getShowDate();\n        CustomDate compareDate = cell.getDate();\n        if(clickDate != null && compareDate.isSameDay(clickDate)){\n            return CLICK_DAY;\n        }\n        if(showDate.isSameMonth(compareDate)){\n            return CURRENT_MONTH_DAY;\n        }\n        if(DateUtil.isToday(compareDate)){\n            return TODAY;\n        }\n        return OTHER_MONTH_DAY;\n    }\n\n    @Override\n    public String getContent(CalendarView.Cell cell, int type) {\n        if(type == TODAY){\n            return \"今\";\n        }\n        return super.getContent(cell, type);\n    }\n\n    @Override\n    public void onDraw(final CalendarView calendarView) {\n        if(this.calendarView == calendarView && progress == 0){\n                ValueAnimator animator = ValueAnimator.ofInt(30,100).setDuration(200);\n                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {\n                    @Override\n                    public void onAnimationUpdate(ValueAnimator animation) {\n                        progress = (int) animation.getAnimatedValue();\n                        calendarView.invalidate();\n\n                    }\n                });\n                animator.start();\n\n        }\n    }\n\n    @Override\n    public void onClick(CalendarView calendarView, CalendarView.Cell cell) {\n        super.onClick(calendarView, cell);\n        this.calendarView = calendarView;\n        progress = 0;\n        clickDate = cell.getDate();\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/palmwifi/testcal/utils/DensityUtils.java",
    "content": "package com.palmwifi.testcal.utils;\n\nimport android.content.Context;\nimport android.util.TypedValue;\n\n\n//常用单位转换的辅助类\n\npublic class DensityUtils {\n\n    private DensityUtils() {\n\n            /* cannot be instantiated */\n\n        throw new UnsupportedOperationException(\"cannot be instantiated\");\n\n    }\n\n\n    /**\n     * dp转px\n     *\n     * @param context\n     * @return\n     */\n\n    public static int dp2px(Context context, float dpVal)\n\n    {\n\n        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,\n\n                dpVal, context.getResources().getDisplayMetrics());\n\n    }\n\n\n    /**\n     * sp转px\n     *\n     * @param context\n     * @return\n     */\n\n    public static int sp2px(Context context, float spVal)\n\n    {\n\n        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,\n\n                spVal, context.getResources().getDisplayMetrics());\n\n    }\n\n\n    /**\n     * px转dp\n     *\n     * @param context\n     * @param pxVal\n     * @return\n     */\n\n    public static float px2dp(Context context, float pxVal)\n\n    {\n\n        final float scale = context.getResources().getDisplayMetrics().density;\n\n        return (pxVal / scale);\n\n    }\n\n\n    /**\n     * px转sp\n     *\n     * @param pxVal\n     * @return\n     */\n\n    public static float px2sp(Context context, float pxVal)\n\n    {\n\n        return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);\n\n    }\n\n\n}"
  },
  {
    "path": "app/src/main/res/layout/ac_dash_broad.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <com.palmwifi.testcal.dash.DashboardView\n        android:id=\"@+id/temp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_gravity=\"center\"\n        android:layout_margin=\"30dp\"\n        android:layout_weight=\"1\"\n        app:angleTextSize=\"14sp\"\n        app:arcBorderDimen=\"10dp\"\n        app:centerCircleRadius=\"5dp\"\n        app:graduatedTextSize=\"9sp\"\n        app:numberTextSize=\"8sp\"\n        app:pointLinePercent=\"0.6\"\n        app:totalAngle=\"300\" />\n\n    <com.palmwifi.testcal.dash.DashboardView\n        android:id=\"@+id/humi\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_gravity=\"center\"\n        android:layout_margin=\"30dp\"\n        android:layout_weight=\"1\"\n        app:angleTextSize=\"14sp\"\n        app:arcBorderDimen=\"12dp\"\n        app:centerCircleRadius=\"10dp\"\n        app:graduatedTextSize=\"9sp\"\n        app:numberTextSize=\"8sp\"\n        app:pointLinePercent=\"0.6\"\n        app:totalAngle=\"300\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/ac_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n    android:gravity=\"center\"\n    android:layout_height=\"match_parent\">\n    <android.support.v7.widget.AppCompatButton\n        android:id=\"@+id/btn_new_month_cal\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"50dp\"\n        android:text=\"RecyclerView日历 月模式\"\n\n        />\n    <android.support.v7.widget.AppCompatButton\n        android:id=\"@+id/btn_new_week_cal\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"50dp\"\n        android:text=\"RecyclerView日历 星期模式\"\n\n        />\n    <android.support.v7.widget.AppCompatButton\n        android:id=\"@+id/btn_cal\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"50dp\"\n        android:text=\"日历\"\n\n        />\n\n    <android.support.v7.widget.AppCompatButton\n        android:id=\"@+id/btn_dash_board\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"50dp\"\n        android:text=\"仪表盘\"\n        />\n    <android.support.v7.widget.AppCompatButton\n        android:id=\"@+id/btn_round_board\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"50dp\"\n        android:text=\"圆盘\"\n        />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/ac_ring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <com.palmwifi.testcal.dash.RingView\n        android:id=\"@+id/humi\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:layout_margin=\"10dp\"\n        android:layout_weight=\"1\"\n        app:arcBorder=\"30dp\"\n        app:arcTextSize=\"14sp\"/>\n\n    <com.palmwifi.testcal.dash.RingView\n        android:id=\"@+id/humi2\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:layout_margin=\"10dp\"\n        android:layout_weight=\"1\"\n        app:arcBorder=\"30dp\"\n        app:arcTextSize=\"14sp\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_calendar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<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:background=\"#f0f0f0\"\n    android:orientation=\"vertical\">\n\n\n\n\n  <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:paddingBottom=\"15dp\"\n      android:layout_marginLeft=\"5dp\"\n      android:layout_marginBottom=\"5dp\"\n      android:layout_marginTop=\"15dp\"\n      android:paddingTop=\"15dp\"\n      android:background=\"@drawable/cal_sign_bg\"\n      android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n      <ImageView\n          android:id=\"@+id/img_cal_left\"\n          android:layout_width=\"25dp\"\n          android:layout_height=\"25dp\"\n          android:scaleType=\"centerInside\"\n          android:layout_alignParentLeft=\"true\"\n          android:layout_marginLeft=\"18dp\"\n          android:background=\"?attr/selectableItemBackgroundBorderless\"\n          />\n\n      <TextView\n          android:id=\"@+id/tv_show_date\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_centerInParent=\"true\"\n          android:textColor=\"@color/base_black_title_color\"\n          android:layout_gravity=\"center_horizontal\"\n          android:textSize=\"14sp\"/>\n      <ImageView\n          android:id=\"@+id/img_cal_right\"\n          android:layout_width=\"25dp\"\n          android:layout_height=\"25dp\"\n          android:scaleType=\"centerInside\"\n          android:layout_alignParentRight=\"true\"\n          android:layout_marginRight=\"18dp\"\n          android:background=\"?attr/selectableItemBackgroundBorderless\"\n          />\n    </RelativeLayout>\n\n\n\n    <TableLayout\n        android:id=\"@+id/tl_time\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"15dp\">\n\n      <TableRow>\n\n        <TextView\n            style=\"@style/dateStyle\"\n            android:text=\"日\" />\n\n        <TextView\n            style=\"@style/dateStyle\"\n            android:text=\"一\" />\n\n        <TextView\n            style=\"@style/dateStyle\"\n            android:text=\"二\" />\n\n        <TextView\n            style=\"@style/dateStyle\"\n            android:text=\"三\" />\n\n        <TextView\n            style=\"@style/dateStyle\"\n            android:text=\"四\" />\n\n        <TextView\n            style=\"@style/dateStyle\"\n            android:text=\"五\" />\n\n        <TextView\n            style=\"@style/dateStyle\"\n            android:text=\"六\" />\n      </TableRow>\n    </TableLayout>\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0.7dp\"\n        android:layout_marginTop=\"7dp\"\n        android:layout_marginBottom=\"2dp\"\n        android:background=\"#d4d4d4\"/>\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"/>\n  </LinearLayout>\n\n\n\n\n\n</RelativeLayout>\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<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:background=\"#f0f0f0\"\n    android:orientation=\"vertical\"\n    tools:context=\"com.palmwifi.testcal.CalendarActivity\">\n\n\n\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingBottom=\"40dp\"\n            android:paddingLeft=\"15dp\"\n            android:paddingRight=\"15dp\"\n            android:layout_marginLeft=\"15dp\"\n            android:layout_marginBottom=\"15dp\"\n            android:layout_marginTop=\"15dp\"\n            android:layout_marginRight=\"12dp\"\n            android:paddingTop=\"15dp\"\n            android:background=\"@drawable/cal_sign_bg\"\n            android:orientation=\"vertical\">\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n                <ImageView\n                    android:id=\"@+id/img_cal_left\"\n                    android:layout_width=\"25dp\"\n                    android:layout_height=\"25dp\"\n                    android:scaleType=\"centerInside\"\n                    android:layout_alignParentLeft=\"true\"\n                    android:layout_marginLeft=\"18dp\"\n                    android:src=\"@mipmap/cal_sign_left\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    />\n\n                <TextView\n                    android:id=\"@+id/tv_show_date\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_centerInParent=\"true\"\n                    android:textColor=\"@color/base_black_title_color\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:textSize=\"14sp\"\n                    android:text=\"2017年4月\" />\n                <ImageView\n                    android:id=\"@+id/img_cal_right\"\n                    android:layout_width=\"25dp\"\n                    android:layout_height=\"25dp\"\n                    android:scaleType=\"centerInside\"\n                    android:layout_alignParentRight=\"true\"\n                    android:layout_marginRight=\"18dp\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:src=\"@mipmap/ca_sign_right\"\n                    />\n            </RelativeLayout>\n\n\n\n            <TableLayout\n                android:id=\"@+id/tl_time\"\n                android:layout_width=\"fill_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"15dp\">\n\n                <TableRow>\n\n                    <TextView\n                        style=\"@style/dateStyle\"\n                        android:text=\"日\" />\n\n                    <TextView\n                        style=\"@style/dateStyle\"\n                        android:text=\"一\" />\n\n                    <TextView\n                        style=\"@style/dateStyle\"\n                        android:text=\"二\" />\n\n                    <TextView\n                        style=\"@style/dateStyle\"\n                        android:text=\"三\" />\n\n                    <TextView\n                        style=\"@style/dateStyle\"\n                        android:text=\"四\" />\n\n                    <TextView\n                        style=\"@style/dateStyle\"\n                        android:text=\"五\" />\n\n                    <TextView\n                        style=\"@style/dateStyle\"\n                        android:text=\"六\" />\n                </TableRow>\n            </TableLayout>\n            <View\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0.7dp\"\n                android:layout_marginTop=\"7dp\"\n                android:layout_marginBottom=\"2dp\"\n                android:background=\"#d4d4d4\"/>\n\n            <android.support.v4.view.ViewPager\n                android:id=\"@+id/viewpager\"\n                android:layout_width=\"fill_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\" />\n        </LinearLayout>\n\n\n\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"RingView\">\n        <attr name=\"totalSection\" format=\"integer\"/>\n        <attr name=\"arcBorder\" format=\"dimension\"/>\n        <attr name=\"arcTextSize\" format=\"dimension\"/>\n        <attr name=\"arcSelectTextColor\" format=\"color\"/>\n        <attr name=\"arcTextColor\" format=\"color\"/>\n        <attr name=\"arc_bg_color\" format=\"color\"/>\n        <attr name=\"arc_select_color\" format=\"color\"/>\n    </declare-styleable>\n\n    <declare-styleable name=\"DashboardView\">\n        <attr name=\"totalAngle\" format=\"integer\" />\n        <attr name=\"centerCircleRadius\" format=\"dimension\" />\n        <attr name=\"arcBorderDimen\" format=\"dimension\" />\n        <attr name=\"numberTextSize\" format=\"dimension\" />\n        <attr name=\"graduatedTextSize\" format=\"dimension\" />\n        <attr name=\"angleTextSize\" format=\"dimension\" />\n        <attr name=\"pointLinePercent\" format=\"float\" />\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n    <color name=\"cal_sign_color\">#ee5b4f</color>\n    <color name=\"cal_buckle_color\">#d4d4d4</color>\n    <color name=\"cal_safe_color\">#b7d961</color>\n    <color name=\"cal_buckle_text_color\">#949494</color>\n    <color name=\"drak_calendar_text_color\">#222222</color>\n    <color name=\"base_black_title_color\">#222222</color>\n\n    <color name=\"arc1\">#099bfb</color>\n    <color name=\"arc2\">#37d547</color>\n    <color name=\"arc3\">#f86669</color>\n    <color name=\"arc_text\">#999999</color>\n    <color name=\"arc_line\">#cfcfcf</color>\n    <color name=\"selectColor\">#f96767</color>\n    <color name=\"arc_bg\">#f0f0f0</color>\n    <color name=\"arc_inteval\">#E8e8e8</color>\n    <color name=\"arc_temp\">#333333</color>\n\n    <color name=\"arc21\">#fc843b</color>\n    <color name=\"arc22\">#37d547</color>\n    <color name=\"arc23\">#079df9</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n\n\n\n    <!-- calendar -->\n    <dimen name=\"bar_margin\">15dp</dimen>\n    <dimen name=\"calendar_day_margin_top\">13dp</dimen>\n    <dimen name=\"calendar_per_view_height\">24dp</dimen>\n    <dimen name=\"calendar_tip_height\">27dp</dimen>\n    <dimen name=\"calendar_item_margin_right\">15dp</dimen>\n    <dimen name=\"calendar_item_margin_left\">13dp</dimen>\n    <dimen name=\"calendar_item_text_margin_left\">7dp</dimen>\n    <dimen name=\"calendar_item_padding\">11dp</dimen>\n    <dimen name=\"calendar_item_height\">43dp</dimen>\n    <dimen name=\"calendar_item_text_margin_right\">18dp</dimen>\n    <dimen name=\"calendar_switch_btn_width\">54dp</dimen>\n    <dimen name=\"calendar_switch_btn_height\">27dp</dimen>\n    <dimen name=\"calendar_inval\">6dp</dimen>\n    <dimen name=\"calendar_small_circle\">8dp</dimen>\n    <dimen name=\"calendar_view_height\">40dp</dimen>\n\n\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">TestCal</string>\n    <string-array name=\"mult_temp_dash\">\n        <item>寒冷</item>\n        <item>舒适</item>\n        <item>炎热</item>\n    </string-array>\n\n    <string-array name=\"mult_huim_dash\">\n        <item>干燥</item>\n        <item>舒适</item>\n        <item>潮湿</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n    <style name=\"dateStyle\">\n        <item name=\"android:layout_width\">fill_parent</item>\n        <item name=\"android:layout_height\">fill_parent</item>\n        <item name=\"android:layout_weight\">1</item>\n        <item name=\"android:gravity\">center</item>\n        <item name=\"android:textSize\">12sp</item>\n        <item name=\"android:textColor\">@color/base_black_title_color</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/test/java/com/palmwifi/testcal/ExampleUnitTest.java",
    "content": "package com.palmwifi.testcal;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.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\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "calendar/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "calendar/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"26.0.2\"\n\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    testCompile 'junit:junit:4.12'\n    compile 'com.android.support:recyclerview-v7:25.3.1'\n\n\n}\n"
  },
  {
    "path": "calendar/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\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\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "calendar/src/androidTest/java/com/bin/david/calendar/ExampleInstrumentedTest.java",
    "content": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() throws Exception {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"com.bin.david.calendar.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "calendar/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bin.david.calendar\" />\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/CalendarAdapter.java",
    "content": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n\nimport java.util.Calendar;\n\n/**\n * Created by huang on 2017/11/22.\n */\n\npublic abstract class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHolder> {\n\n    protected Context mContext;\n    private CustomDate today = new CustomDate();\n\n    public static final int MONTH_MODE = 0;\n    public static final int WEEK_MODE = 1;\n    private int mode = MONTH_MODE;\n\n    public CalendarAdapter(int mode) {\n        this.mode = mode;\n    }\n\n    public CalendarAdapter() {\n        this.mode = MONTH_MODE;\n    }\n\n    @Override\n    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        this.mContext = parent.getContext();\n        LayoutInflater mLayoutInflater = LayoutInflater.from(mContext);\n        CalendarView calendarView;\n        if(viewType == MONTH_MODE) {\n            calendarView = (CalendarMonthView) mLayoutInflater.inflate(R.layout.item_month_calendar, parent, false);\n        }else{\n             calendarView = (CalendarWeekView) mLayoutInflater.inflate(R.layout.item_week_calendar, parent, false);\n        }\n        decorateCalendarView(calendarView);\n        return new ViewHolder(calendarView);\n    }\n\n    //负责装饰日历\n    protected abstract void decorateCalendarView(CalendarView calendarView);\n\n    @Override\n    public void onBindViewHolder(ViewHolder holder, int position) {\n        Calendar calendar = Calendar.getInstance();\n        int realPosition = position - Integer.MAX_VALUE / 2;\n        if(mode == MONTH_MODE) {\n            CalendarMonthView monthView = (CalendarMonthView) holder.itemView;\n            calendar.add(Calendar.MONTH, realPosition);\n            CustomDate customDate = new CustomDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, 1);\n            monthView.setShowDate(customDate);\n        }else{\n            CalendarWeekView monthView = (CalendarWeekView)holder.itemView;\n            int week = calendar.get(Calendar.DAY_OF_WEEK)-1;\n            calendar.add(Calendar.DATE,(realPosition*7 -week));\n            CustomDate customDate = new CustomDate(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH));\n            monthView.setShowDate(customDate);\n        }\n    }\n\n    public int getMonthPosition(CustomDate customDate){\n        int position = (customDate.year - today.year)*12\n                + (customDate.month - today.month);\n        return  Integer.MAX_VALUE / 2 + position;\n    }\n    public int getWeekPosition(CustomDate customDate){\n\n       int day =  DateUtil.betweenDays(customDate,today);\n        Calendar calendar = Calendar.getInstance();\n        int week = calendar.get(Calendar.DAY_OF_WEEK)-1;\n        int position = (day -week)/7;\n        return  Integer.MAX_VALUE / 2 +position;\n    }\n\n    @Override\n    public int getItemCount() {\n        return Integer.MAX_VALUE;\n    }\n\n    static  class ViewHolder extends RecyclerView.ViewHolder {\n\n        ViewHolder(View itemView) {\n            super(itemView);\n        }\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        return mode;\n    }\n\n    public int getMode() {\n        return mode;\n    }\n\n    public void setMode(int mode) {\n        this.mode = mode;\n        notifyDataSetChanged();\n    }\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/CalendarMonthView.java",
    "content": "package com.bin.david.calendar;\n\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport android.util.AttributeSet;\n\n\npublic class CalendarMonthView extends CalendarView {\n\n    private static final int INVALID = -1;\n\n    public CalendarMonthView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n\n    public CalendarMonthView(Context context) {\n        super(context);\n    }\n\n\n    public CalendarMonthView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    public void setShowDate(CustomDate showDate){\n        mShowDate = showDate;\n        fillMonthDate();\n        invalidate();\n    }\n\n\n    @Override\n    public void measureClickCell(int col, int row) {\n        if(mShowDate != null) {\n            if (col >= TOTAL_COL || row >= TOTAL_ROW)\n                return;\n            Cell cell = cells[row][col];\n            if (cell == null || cell.getDate() == null) {\n                return;\n            }\n            geCalendarDraw().onClick(this,cell);\n            if(getOnClickListener() != null){\n                getOnClickListener().onClick(this,cell);\n            }\n            fillMonthDate();\n            invalidate();\n        }\n    }\n\n    @Override\n    public int getTotalRow() {\n        return 6;\n    }\n\n\n    private void fillMonthDate() {\n\n        int lastMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month - 1);\n        int currentMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month);\n        int firstDayWeek = DateUtil.getWeekDayFromDate(mShowDate.year, mShowDate.month);\n        int day = 0;\n        for (int i = 0; i < TOTAL_ROW; i++) {\n            if(cells[i] == null){\n                cells[i] = new Cell[TOTAL_COL];\n            }\n            for (int j = 0; j < TOTAL_COL; j++) {\n                int position = j + i * TOTAL_COL;\n                int year = INVALID,month = INVALID,monthDay = INVALID;\n                if (position >= firstDayWeek && position < firstDayWeek + currentMonthDays) {\n                    day++;\n                    year = mShowDate.year;\n                    month = mShowDate.month;\n                    monthDay = day;\n                } else if (position < firstDayWeek) {\n                    year = mShowDate.year;\n                    month = mShowDate.month-1;\n                    monthDay = lastMonthDays - (firstDayWeek - position - 1);\n                } else if (position >= firstDayWeek + currentMonthDays) {\n                    year = mShowDate.year;\n                    month = mShowDate.month + 1;\n                    monthDay = position - firstDayWeek - currentMonthDays + 1;\n                }\n\n                Cell cell = cells[i][j];\n                if(year == INVALID){\n                    cell.update(null,i,j);\n                }else {\n                    if (cell != null && cell.getDate() != null) {\n                        cell.getDate().update(year,month,monthDay,j);\n                        cell.update(cell.getDate(),i,j);\n                    } else {\n                        CustomDate date = new CustomDate(year,month,monthDay,j);\n                        cells[i][j] = new Cell(date, i, j);\n                    }\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/CalendarRecyclerHelper.java",
    "content": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.PagerSnapHelper;\nimport android.support.v7.widget.RecyclerView;\nimport android.widget.AbsListView;\n\n/**\n * Created by huang on 2017/11/22.\n */\n\npublic class CalendarRecyclerHelper {\n\n    private CalendarRecyclerHelper(){}\n\n    public static void init(Context context, RecyclerView recyclerView, CalendarAdapter adapter){\n        init(context,recyclerView,adapter,null);\n    }\n\n\n    public static void init(Context context, RecyclerView recyclerView, CalendarAdapter adapter, final CalendarView.OnCalendarPageChanged onCalendarPageChanged){\n        LinearLayoutManager manager = new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false);\n        recyclerView.setLayoutManager(manager);\n        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                if(newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){\n                    CalendarView calendarView = (CalendarView) recyclerView.getChildAt(0);\n                    CustomDate showDate =  calendarView.getShowDate();\n                    if(onCalendarPageChanged != null) {\n                        onCalendarPageChanged.onPageChanged(showDate);\n                    }\n                }\n                super.onScrollStateChanged(recyclerView, newState);\n            }\n        });\n        //返回当前月\n        if(onCalendarPageChanged != null){\n            onCalendarPageChanged.onPageChanged(new CustomDate());\n        }\n        recyclerView.setAdapter(adapter);\n        manager.scrollToPosition(Integer.MAX_VALUE/2);\n        new PagerSnapHelper().attachToRecyclerView(recyclerView);\n    }\n\n\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/CalendarView.java",
    "content": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.support.annotation.Nullable;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\npublic abstract class CalendarView extends View {\n\n\n    public static final int TOTAL_COL = 7;\n    protected int TOTAL_ROW;\n    private Paint mPaint;\n    private int mCellSpace;\n    private int mCellSpaceY;\n    protected Cell cells[][];\n    private int touchSlop;\n    private int defaultTextColor;\n    private int defaultTextSize;\n    private CalendarDraw calendarDraw; //绘制全部交给calendarDraw\n    public  CustomDate mShowDate;\n    private OnClickListener onClickListener;\n\n    public CalendarView(Context context, AttributeSet attrs) {\n        this(context, attrs,0);\n    }\n\n    public CalendarView(Context context) {\n        this(context,null);\n    }\n\n    public CalendarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        TOTAL_ROW = getTotalRow();\n        cells = new Cell[TOTAL_ROW][TOTAL_COL];\n        init(context,attrs);\n\n    }\n\n    protected abstract void measureClickCell(int col, int row);\n\n\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        calendarDraw.onDraw(this);\n        Rect rect;\n        Cell cell;\n        for (int i = 0; i < TOTAL_ROW; i++) {\n            if (cells[i] != null) {\n                for(int j = 0;j <TOTAL_COL;j++){\n                    cell = cells[i][j];\n                    if(cell != null && cell.getDate()!=null){\n                        rect = cell.getRect(mCellSpace,mCellSpaceY);\n                        geCalendarDraw().onDraw(this,canvas,cell,rect, mPaint);\n                    }\n                }\n            }\n        }\n    }\n\n    private void init(Context context,AttributeSet attrs) {\n        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        if(attrs != null) {\n            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CalendarView);\n            defaultTextSize = (int) a.getDimension(R.styleable.CalendarView_baseTextSize, 25);\n            defaultTextColor = a.getColor(R.styleable.CalendarView_baseTextColor, Color.parseColor(\"#333333\"));\n            mCellSpaceY = (int) a.getDimension(R.styleable.CalendarView_rowHeight,getResources().getDimensionPixelOffset(R.dimen.calendar_view_height));\n            a.recycle();\n        }else{\n            defaultTextColor =  Color.parseColor(\"#333333\");\n            defaultTextSize = 25;\n        }\n        touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();\n        calendarDraw = new CalendarDraw();\n\n\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        int width= MeasureSpec.getSize(widthMeasureSpec);\n        int height = mCellSpaceY *TOTAL_ROW;\n        setMeasuredDimension(width, height);\n    }\n\n\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        int mViewWidth = w;\n        mCellSpace = mViewWidth / TOTAL_COL;\n        mPaint.setTextSize(mCellSpace / 3);\n    }\n\n    private float mDownX;\n    private float mDownY;\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mDownX = event.getX();\n                mDownY = event.getY();\n                break;\n            case MotionEvent.ACTION_UP:\n                float disX = event.getX() - mDownX;\n                float disY = event.getY() - mDownY;\n                if (Math.abs(disX) < touchSlop && Math.abs(disY) < touchSlop) {\n                    int col = (int) (mDownX / mCellSpace);\n                    int row = (int) (mDownY / mCellSpaceY);\n                    measureClickCell(col, row);\n                }\n                break;\n        }\n        return true;\n    }\n\n    public Cell getCell(int row,int col) {\n\n        return cells[row][col];\n    }\n\n    public static class Cell {\n        private CustomDate date;\n        public int row; //行\n        public int col; //列\n        private Rect rect;\n\n        Cell(CustomDate date, int row, int col) {\n            this.date = date;\n            this.row = row;\n            this.col = col;\n            rect = new Rect();\n        }\n\n        void update(CustomDate date,int row,int col) {\n            this.date = date;\n            this.col = col;\n            this.row = row;\n        }\n\n       public CustomDate getDate() {\n           return date;\n       }\n\n       public Rect getRect(int perW, int perH){\n            int left = perW * col;\n            int top= row * perH;\n            int right = left+perW;\n            int bottom = top + perH;\n            rect.set(left,top,right,bottom);\n            return rect;\n        }\n\n   }\n\n\n\n    public CustomDate getShowDate() {\n        return mShowDate;\n    }\n\n    protected CalendarDraw geCalendarDraw() {\n        return calendarDraw;\n    }\n\n    public void addDrawFormat(IDrawFormat drawFormat){\n        calendarDraw.getDrawFormats().add(drawFormat);\n    }\n\n    public List<IDrawFormat> getDrawFormats(){\n\n        return calendarDraw.getDrawFormats();\n    }\n\n\n    public int getDefaultTextColor() {\n        return defaultTextColor;\n    }\n\n    public void setDefaultTextColor(int defaultTextColor) {\n        this.defaultTextColor = defaultTextColor;\n    }\n\n    public int getDefaultTextSize() {\n        return defaultTextSize;\n    }\n\n    public void setDefaultTextSize(int defaultTextSize) {\n        this.defaultTextSize = defaultTextSize;\n    }\n\n    /**\n     * Created by huang on 2017/11/22.\n     */\n\n    public static class CalendarDraw implements IDrawFormat{\n\n         private List<IDrawFormat> smallDrawFormats= new ArrayList<>();\n\n\n        @Override\n        public void onDraw(CalendarView calendarView) {\n            int size  = smallDrawFormats.size();\n            for(int i =0 ;i < size;i++){\n                smallDrawFormats.get(i).onDraw(calendarView);\n            }\n        }\n\n        @Override\n        public int getDateType(CalendarView calendarView, Cell cell) {\n            return 0;\n        }\n\n        public void onDraw(CalendarView calendarView, Canvas canvas, Cell cell, Rect rect, Paint paint) {\n              int size  = smallDrawFormats.size();\n              for(int i =0 ;i < size;i++){\n                   smallDrawFormats.get(i).onDraw(calendarView,canvas,cell,rect,paint);\n              }\n         }\n\n\n\n         public void onClick(CalendarView calendarView,Cell cell) {\n             int size  = smallDrawFormats.size();\n             for(int i =0 ;i < size;i++){\n                 smallDrawFormats.get(i).onClick(calendarView,cell);\n             }\n         }\n\n         public List<IDrawFormat> getDrawFormats() {\n              return smallDrawFormats;\n         }\n    }\n\n    public OnClickListener getOnClickListener() {\n        return onClickListener;\n    }\n\n    public void setOnClickListener(OnClickListener onClickListener) {\n        this.onClickListener = onClickListener;\n    }\n\n    public  interface OnClickListener{\n        void onClick(CalendarView calendarView,Cell cell);\n    }\n\n    public interface OnCalendarPageChanged{\n\n        void onPageChanged(CustomDate showDate);\n    }\n\n    public abstract int getTotalRow();\n\n    /**\n     * Created by huang on 2017/11/22.\n     */\n\n    public static interface IDrawFormat {\n\n        void onDraw(CalendarView calendarView);\n\n        int getDateType(CalendarView calendarView, Cell cell);\n\n        void onDraw(CalendarView calendarView, Canvas canvas, Cell cell, Rect rect, Paint paint);\n\n         void onClick(CalendarView calendarView, Cell cell);\n\n    }\n\n    public static int getTextHeight(Paint paint){\n        Paint.FontMetrics fontMetrics = paint.getFontMetrics();\n        return (int) (fontMetrics.descent - fontMetrics.ascent);\n    }\n\n    public static float getTextCenterY(int centerY,Paint paint){\n        return centerY-((paint.descent() + paint.ascent()) / 2);\n    }\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/CalendarWeekView.java",
    "content": "package com.bin.david.calendar;\n\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport android.util.AttributeSet;\n\n\npublic class CalendarWeekView extends CalendarView {\n\n\n    public CalendarWeekView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n\n    public CalendarWeekView(Context context) {\n        super(context);\n    }\n\n\n    public CalendarWeekView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    public void setShowDate(CustomDate showDate) {\n        mShowDate = showDate;\n        fillWeekDate();\n        invalidate();\n    }\n\n\n    @Override\n    public void measureClickCell(int col, int row) {\n        if (mShowDate != null) {\n            if (col >= TOTAL_COL || row >= TOTAL_ROW)\n                return;\n            Cell cell = cells[row][col];\n            if (cell == null || cell.getDate() == null) {\n                return;\n            }\n            geCalendarDraw().onClick(this, cell);\n            if (getOnClickListener() != null) {\n                getOnClickListener().onClick(this, cell);\n            }\n            fillWeekDate();\n            invalidate();\n        }\n    }\n\n    @Override\n    public int getTotalRow() {\n        return 1;\n    }\n\n\n    private void fillWeekDate() {\n\n        int currentMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month);\n        cells[0] = new Cell[TOTAL_COL];\n        for (int j = 0; j < TOTAL_COL; j++) {\n            int year = mShowDate.year, month = mShowDate.month;\n            int monthDay = mShowDate.day + j;\n            if (monthDay > currentMonthDays) {\n                month += 1;\n                monthDay -= currentMonthDays;\n            }\n            Cell cell = cells[0][j];\n            if (cell != null && cell.getDate() != null) {\n                cell.getDate().update(year, month, monthDay, j);\n                cell.update(cell.getDate(), 0, j);\n            } else {\n                CustomDate date = new CustomDate(year, month, monthDay, j);\n                cells[0][j] = new Cell(date, 0, j);\n            }\n\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/CustomDate.java",
    "content": "package com.bin.david.calendar;\n\nimport java.io.Serializable;\n\npublic class CustomDate implements Serializable,Comparable<CustomDate>{\n\t\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tpublic int year;\n\tpublic int month;\n\tpublic int day;\n\tpublic int week;\n\t\n\tpublic CustomDate(int year,int month,int day,int week){\n\t\tif(month > 12){\n\t\t\tmonth = 1;\n\t\t\tyear++;\n\t\t}else if(month <1){\n\t\t\tmonth = 12;\n\t\t\tyear--;\n\t\t}\n\t\tthis.year = year;\n\t\tthis.month = month;\n\t\tthis.day = day;\n\t\tthis.week = week;\n\t}\n\n\tpublic void  update(int year,int month,int day,int week){\n\t\tif(month > 12){\n\t\t\tmonth = 1;\n\t\t\tyear++;\n\t\t}else if(month <1){\n\t\t\tmonth = 12;\n\t\t\tyear--;\n\t\t}\n\t\tthis.year = year;\n\t\tthis.month = month;\n\t\tthis.day = day;\n\t\tthis.week = week;\n\t}\n\n\n\tpublic CustomDate(int year,int month,int day){\n\t\tif(month > 12){\n\t\t\tmonth = 1;\n\t\t\tyear++;\n\t\t}else if(month <1){\n\t\t\tmonth = 12;\n\t\t\tyear--;\n\t\t}\n\t\tthis.year = year;\n\t\tthis.month = month;\n\t\tthis.day = day;\n\t}\n\t\n\tpublic CustomDate(){\n\t\tthis.year = DateUtil.getYear();\n\t\tthis.month = DateUtil.getMonth();\n\t\tthis.day = DateUtil.getCurrentMonthDay();\n\t\tthis.week = DateUtil.getWeekDay();\n\t}\n\t\n\n\t\n\tpublic boolean isSameDay(CustomDate customDate){\n\t\treturn year == customDate.year&& customDate.month == month && day == customDate.day;\n\t}\n\n\tpublic boolean isSameMonth(CustomDate customDate){\n\t\treturn year == customDate.year&& customDate.month == month ;\n\t}\n\n\tpublic boolean isSameYear(CustomDate customDate){\n\t\treturn year == customDate.year;\n\t}\n\n\n\t@Override\n\tpublic String toString() {\n\t\treturn year+\"-\"+month+\"-\"+day;\n\t}\n\n\n\t@Override\n\tpublic int compareTo(CustomDate another) {\n\tif(another != null){\n\t\tif(this.year >another.year){\n\t\t\treturn 1;\n\t\t}else if(this.year  == another.year && this.month > another.month){\n\t\t\treturn 1;\n\t\t}else if(this.year  == another.year && this.month == another.month && this.day >another.day){\n\t\t\treturn 1;\n\t\t}else if(this.year  == another.year && this.month == another.month && this.day == another.day){\n\t\t\treturn 0;\n\t\t}\n\t\treturn -1;\n\t}\n\t\treturn -1;\n\t}\n\n\t\n\tpublic int compareDays(CustomDate another){\n\t\tif(this.month == another.month){\n\t\t\treturn this.day - another.day;\n\t\t}else{\n\t\t\tint days = DateUtil.getMonthDays(another.year,another.month);\n\t\t\treturn days - another.day + this.day;\n\t\t}\n\t}\n\n\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/DateUtil.java",
    "content": "package com.bin.david.calendar;\n\nimport android.annotation.SuppressLint;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.Date;\n\n\npublic class DateUtil {\n\n\tpublic static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\"yyyyMMdd\");\n\n\tpublic static int getMonthDays(int year, int month) {\n\t\tif (month > 12) {\n\t\t\tmonth = 1;\n\t\t\tyear += 1;\n\t\t} else if (month < 1) {\n\t\t\tmonth = 12;\n\t\t\tyear -= 1;\n\t\t}\n\t\tint[] arr = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\n\t\tint days = 0;\n\n\t\tif ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {\n\t\t\tarr[1] = 29; \n\t\t}\n\n\t\ttry {\n\t\t\tdays = arr[month - 1];\n\t\t} catch (Exception e) {\n\t\t\te.getStackTrace();\n\t\t}\n\n\t\treturn days;\n\t}\n\t\n\tpublic static int getYear() {\n\t\treturn Calendar.getInstance().get(Calendar.YEAR);\n\t}\n\n\tpublic static int getMonth() {\n\t\treturn Calendar.getInstance().get(Calendar.MONTH) + 1;\n\t}\n\n\tpublic static int getCurrentMonthDay() {\n\t\treturn Calendar.getInstance().get(Calendar.DAY_OF_MONTH);\n\t}\n\n\tpublic static int getWeekDay() {\n\t\treturn Calendar.getInstance().get(Calendar.DAY_OF_WEEK);\n\t}\n\n\tpublic static int getHour() {\n\t\treturn Calendar.getInstance().get(Calendar.HOUR_OF_DAY);\n\t}\n\tpublic static int getMinute() {\n\t\treturn Calendar.getInstance().get(Calendar.MINUTE);\n\t}\n\n\n\n\n\tpublic static int getWeekDayFromDate(int year, int month) {\n\t\tCalendar cal = Calendar.getInstance();\n\t\tcal.setTime(getDateFromString(year, month));\n\t\tint week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;\n\t\tif (week_index < 0) {\n\t\t\tweek_index = 0;\n\t\t}\n\t\treturn week_index;\n\t}\n\n\t@SuppressLint(\"SimpleDateFormat\")\n\tpublic static Date getDateFromString(int year, int month) {\n\t\tString dateString = year + \"-\" + (month > 9 ? month : (\"0\" + month))\n\t\t\t\t+ \"-01\";\n\t\tDate date = null;\n\t\ttry {\n\t\t\tSimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd\");\n\t\t\tdate = sdf.parse(dateString);\n\t\t} catch (ParseException e) {\n\t\t\tSystem.out.println(e.getMessage());\n\t\t}\n\t\treturn date;\n\t}\n\tpublic static boolean isToday(CustomDate date){\n\t\treturn(date.year == DateUtil.getYear() &&\n\t\t\t\tdate.month == DateUtil.getMonth() \n\t\t\t\t&& date.day == DateUtil.getCurrentMonthDay());\n\t}\n\t\n\tpublic static boolean isCurrentMonth(CustomDate date){\n\t\treturn(date.year == DateUtil.getYear() &&\n\t\t\t\tdate.month == DateUtil.getMonth());\n\t}\n\t\n\tpublic static int betweenDays(CustomDate date, CustomDate compareDate){\n\t\tint dayCount = 0;\n\t\ttry {\n\t\t\tDate date1 = simpleDateFormat.parse(date.year+(date.month<10?\"0\"+date.month :\"\"+date.month)+\"\"+(date.day<10?\"0\"+date.day:\"\"+date.day));\n\t\t\tDate compareDate1 = simpleDateFormat.parse(compareDate.year+(compareDate.month<10?\"0\"+compareDate.month :\"\"+compareDate.month)+\"\"+(compareDate.day<10?\"0\"+compareDate.day:\"\"+compareDate.day));\n\t\t\tdayCount = (int) ((date1.getTime()-compareDate1.getTime())/(3600000*24));\n\t\t} catch (ParseException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn dayCount;\n\t}\n\t\n\t\n\n\t\n\n\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/LunarCalendar.java",
    "content": "package com.bin.david.calendar;\n\n\nimport android.text.TextUtils;\n\nimport java.util.Date;\nimport java.util.GregorianCalendar;\nimport java.util.TimeZone;\n\n@SuppressWarnings(\"unused\")\nclass LunarCalendar {\n    /**\n     * 支持转换的最小农历年份\n     */\n    private static final int MIN_YEAR = 1900;\n    /**\n     * 支持转换的最大农历年份\n     */\n    private static final int MAX_YEAR = 2099;\n\n    /**\n     * 公历每月前的天数\n     */\n    private static final int DAYS_BEFORE_MONTH[] = {0, 31, 59, 90, 120, 151, 181,\n            212, 243, 273, 304, 334, 365};\n\n    /**\n     * 农历月份第一天转写\n     */\n    private static final String[] monthStr = {\"春节\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"冬月\", \"腊月\"};\n\n    /**\n     * 传统农历节日\n     */\n    private static final String[] traditionFestivalStr = {\"除夕\", \"0101春节\", \"0115元宵\", \"0505端午\", \"0707七夕\", \"0815中秋\", \"0909重阳\"};\n\n    /**\n     * 农历大写\n     */\n    private static final String daysStr[] = {\"初一\", \"初二\", \"初三\", \"初四\", \"初五\", \"初六\",\n            \"初七\", \"初八\", \"初九\", \"初十\", \"十一\", \"十二\", \"十三\", \"十四\", \"十五\", \"十六\", \"十七\",\n            \"十八\", \"十九\", \"二十\", \"廿一\", \"廿二\", \"廿三\", \"廿四\", \"廿五\", \"廿六\", \"廿七\", \"廿八\",\n            \"廿九\", \"三十\"};\n\n    /**\n     * 公历节日\n     */\n    private final static String[] mSolarCalendar = {\n            \"0101元旦\", \"0214情人节\", \"0315消权日\", \"0401愚人节\", \"0501劳动节\", \"0504青年节\",\n            \"0601儿童节\", \"0701建党节\", \"0801建军节\", \"0910教师节\", \"1001国庆节\", \"1224平安夜\",\n            \"1225圣诞节\"\n    };\n\n    /**\n     * 返回传统农历节日\n     *\n     * @param year  农历年\n     * @param month 农历月\n     * @param day   农历日\n     * @return 返回传统农历节日\n     */\n    private static String getTraditionFestivalText(int year, int month, int day) {\n        if (month == 12) {\n            int count = daysInLunarMonth(year, month);\n            if (day == count) {\n                return traditionFestivalStr[0];//除夕\n            }\n        }\n        String text = getString(month, day);\n        String festivalStr = \"\";\n        for (String festival : traditionFestivalStr) {\n            if (festival.contains(text)) {\n                festivalStr = festival.replace(text, \"\");\n                break;\n            }\n        }\n        return festivalStr;\n    }\n\n\n    /**\n     * 数字转换为汉字月份\n     *\n     * @param month 月\n     * @return 数字转换为汉字月份\n     */\n    private static String numToChineseMonth(int month) {\n        return monthStr[month - 1];\n    }\n\n    /**\n     * 数字转换为汉字日\n     *\n     * @param day day\n     * @return 数字转换为汉字日\n     */\n    static String numToChineseDay(int day) {\n        return daysStr[day - 1];\n    }\n\n    /**\n     * 数字转换为农历节日或者日期\n     *\n     * @param month 月\n     * @param day   日\n     * @return 数字转换为汉字日\n     */\n    private static String numToChinese(int month, int day) {\n        if (day == 1) {\n            return numToChineseMonth(month);\n        }\n        return daysStr[day - 1];\n    }\n\n    /**\n     * 用来表示1900年到2099年间农历年份的相关信息，共24位bit的16进制表示，其中：\n     * 1. 前4位表示该年闰哪个月；\n     * 2. 5-17位表示农历年份13个月的大小月分布，0表示小，1表示大；\n     * 3. 最后7位表示农历年首（正月初一）对应的公历日期。\n     * <p/>\n     * 以2014年的数据0x955ABF为例说明：\n     * 1001 0101 0101 1010 1011 1111\n     * 闰九月 农历正月初一对应公历1月31号\n     */\n    private static final int LUNAR_INFO[] = {\n            0x84B6BF,/*1900*/\n            0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A,/*1901-1910*/\n            0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754,/*1911-1920*/\n            0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E,/*1921-1930*/\n            0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48,/*1931-1940*/\n            0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51,/*1941-1950*/\n            0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C,/*1951-1960*/\n            0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46,/*1961-1970*/\n            0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50,/*1971-1980*/\n            0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x095746, 0x5497BB,/*1981-1990*/\n            0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645,/*1991-2000*/\n            0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E,/*2001-2010*/\n            0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9,/*2011-2020*/\n            0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x6a573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43,/*2021-2030*/\n            0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C,/*2031-2040*/\n            0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37,/*2041-2050*/\n            0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06AA44, 0x4AB638, 0x0AAE4C, 0x092E42,/*2051-2060*/\n            0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B,/*2061-2070*/\n            0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6,/*2071-2080*/\n            0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E,/*2081-2090*/\n            0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5          /*2091-2099*/\n    };\n\n    /**\n     * 将农历日期转换为公历日期\n     *\n     * @param year        农历年份\n     * @param month       农历月\n     * @param monthDay    农历日\n     * @param isLeapMonth 该月是否是闰月\n     * @return 返回农历日期对应的公历日期，year0, month1, day2.\n     */\n    static int[] lunarToSolar(int year, int month, int monthDay,\n                              boolean isLeapMonth) {\n        int dayOffset;\n        int leapMonth;\n        int i;\n\n        if (year < MIN_YEAR || year > MAX_YEAR || month < 1 || month > 12\n                || monthDay < 1 || monthDay > 30) {\n            throw new IllegalArgumentException(\n                    \"Illegal lunar date, must be like that:\\n\\t\" +\n                            \"year : 1900~2099\\n\\t\" +\n                            \"month : 1~12\\n\\t\" +\n                            \"day : 1~30\");\n        }\n\n        dayOffset = (LUNAR_INFO[year - MIN_YEAR] & 0x001F) - 1;\n\n        if (((LUNAR_INFO[year - MIN_YEAR] & 0x0060) >> 5) == 2)\n            dayOffset += 31;\n\n        for (i = 1; i < month; i++) {\n            if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (i - 1))) == 0)\n                dayOffset += 29;\n            else\n                dayOffset += 30;\n        }\n\n        dayOffset += monthDay;\n        leapMonth = (LUNAR_INFO[year - MIN_YEAR] & 0xf00000) >> 20;\n\n        // 这一年有闰月\n        if (leapMonth != 0) {\n            if (month > leapMonth || (month == leapMonth && isLeapMonth)) {\n                if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (month - 1))) == 0)\n                    dayOffset += 29;\n                else\n                    dayOffset += 30;\n            }\n        }\n\n        if (dayOffset > 366 || (year % 4 != 0 && dayOffset > 365)) {\n            year += 1;\n            if (year % 4 == 1)\n                dayOffset -= 366;\n            else\n                dayOffset -= 365;\n        }\n\n        int[] solarInfo = new int[3];\n        for (i = 1; i < 13; i++) {\n            int iPos = DAYS_BEFORE_MONTH[i];\n            if (year % 4 == 0 && i > 2) {\n                iPos += 1;\n            }\n\n            if (year % 4 == 0 && i == 2 && iPos + 1 == dayOffset) {\n                solarInfo[1] = i;\n                solarInfo[2] = dayOffset - 31;\n                break;\n            }\n\n            if (iPos >= dayOffset) {\n                solarInfo[1] = i;\n                iPos = DAYS_BEFORE_MONTH[i - 1];\n                if (year % 4 == 0 && i > 2) {\n                    iPos += 1;\n                }\n                if (dayOffset > iPos)\n                    solarInfo[2] = dayOffset - iPos;\n                else if (dayOffset == iPos) {\n                    if (year % 4 == 0 && i == 2)\n                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1] + 1;\n                    else\n                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1];\n\n                } else\n                    solarInfo[2] = dayOffset;\n                break;\n            }\n        }\n        solarInfo[0] = year;\n\n        return solarInfo;\n    }\n\n    /**\n     * 将公历日期转换为农历日期，且标识是否是闰月\n     *\n     * @param year     year\n     * @param month    month\n     * @param monthDay monthDay\n     * @return 返回公历日期对应的农历日期，year0，month1，day2，leap3\n     */\n    static int[] solarToLunar(int year, int month, int monthDay) {\n        int[] lunarDate = new int[4];\n        Date baseDate = new GregorianCalendar(1900, 0, 31).getTime();\n        Date objDate = new GregorianCalendar(year, month - 1, monthDay).getTime();\n        int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);\n\n        // 用offset减去每农历年的天数计算当天是农历第几天\n        // iYear最终结果是农历的年份, offset是当年的第几天\n        int iYear, daysOfYear = 0;\n        for (iYear = MIN_YEAR; iYear <= MAX_YEAR && offset > 0; iYear++) {\n            daysOfYear = daysInLunarYear(iYear);\n            offset -= daysOfYear;\n        }\n        if (offset < 0) {\n            offset += daysOfYear;\n            iYear--;\n        }\n\n        // 农历年份\n        lunarDate[0] = iYear;\n\n        int leapMonth = leapMonth(iYear); // 闰哪个月,1-12\n        boolean isLeap = false;\n        // 用当年的天数offset,逐个减去每月（农历）的天数，求出当天是本月的第几天\n        int iMonth, daysOfMonth = 0;\n        for (iMonth = 1; iMonth <= 13 && offset > 0; iMonth++) {\n            daysOfMonth = daysInLunarMonth(iYear, iMonth);\n            offset -= daysOfMonth;\n        }\n        // 当前月超过闰月，要校正\n        if (leapMonth != 0 && iMonth > leapMonth) {\n            --iMonth;\n\n            if (iMonth == leapMonth) {\n                isLeap = true;\n            }\n        }\n        // offset小于0时，也要校正\n        if (offset < 0) {\n            offset += daysOfMonth;\n            --iMonth;\n        }\n\n        lunarDate[1] = iMonth;\n        lunarDate[2] = offset + 1;\n        lunarDate[3] = isLeap ? 1 : 0;\n\n        return lunarDate;\n    }\n\n    /**\n     * y\n     * 传回农历year年month月的总天数\n     *\n     * @param year  要计算的年份\n     * @param month 要计算的月\n     * @return 传回天数\n     */\n    private static int daysInMonth(int year, int month) {\n        return daysInMonth(year, month, false);\n    }\n\n    /**\n     * 传回农历year年month月的总天数\n     *\n     * @param year  要计算的年份\n     * @param month 要计算的月\n     * @param leap  当月是否是闰月\n     * @return 传回天数，如果闰月是错误的，返回0.\n     */\n    @SuppressWarnings(\"all\")\n    private static int daysInMonth(int year, int month, boolean leap) {\n        int leapMonth = leapMonth(year);\n        int offset = 0;\n\n        // 如果本年有闰月且month大于闰月时，需要校正\n        if (leapMonth != 0 && month > leapMonth) {\n            offset = 1;\n        }\n\n        // 不考虑闰月\n        if (!leap) {\n            return daysInLunarMonth(year, month + offset);\n        } else {\n            // 传入的闰月是正确的月份\n            if (leapMonth != 0 && leapMonth == month) {\n                return daysInLunarMonth(year, month + 1);\n            }\n        }\n\n        return 0;\n    }\n\n    /**\n     * 传回农历 year年的总天数\n     *\n     * @param year 将要计算的年份\n     * @return 返回传入年份的总天数\n     */\n    private static int daysInLunarYear(int year) {\n        int i, sum = 348;\n        if (leapMonth(year) != 0) {\n            sum = 377;\n        }\n        int monthInfo = LUNAR_INFO[year - MIN_YEAR] & 0x0FFF80;\n        for (i = 0x80000; i > 0x7; i >>= 1) {\n            if ((monthInfo & i) != 0)\n                sum += 1;\n        }\n        return sum;\n    }\n\n    /**\n     * 传回农历 year年month月的总天数，总共有13个月包括闰月\n     *\n     * @param year  将要计算的年份\n     * @param month 将要计算的月份\n     * @return 传回农历 year年month月的总天数\n     */\n    private static int daysInLunarMonth(int year, int month) {\n        if ((LUNAR_INFO[year - MIN_YEAR] & (0x100000 >> month)) == 0)\n            return 29;\n        else\n            return 30;\n    }\n\n    /**\n     * 传回农历 year年闰哪个月 1-12 , 没闰传回 0\n     *\n     * @param year 将要计算的年份\n     * @return 传回农历 year年闰哪个月1-12, 没闰传回 0\n     */\n    private static int leapMonth(int year) {\n        return ((LUNAR_INFO[year - MIN_YEAR] & 0xF00000)) >> 20;\n    }\n\n    private final static int[] solarTermInfo = {\n            0, 21208, 42467, 63836, 85337, 107014, 128867, 150921,\n            173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033,\n            353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758\n    };\n\n\n    /**\n     * 获取公历节日\n     *\n     * @param month 公历月份\n     * @param day   公历日期\n     * @return 公历节日\n     */\n    public static String getSolarCalendar(int month, int day) {\n        String text = getString(month, day);\n        String solar = \"\";\n        for (String aMSolarCalendar : mSolarCalendar) {\n            if (aMSolarCalendar.contains(text)) {\n                solar = aMSolarCalendar.replace(text, \"\");\n                break;\n            }\n        }\n        return solar;\n    }\n\n    private static String getString(int month, int day) {\n        return (month >= 10 ? String.valueOf(month) : \"0\" + month) + (day >= 10 ? day : \"0\" + day);\n    }\n\n    /**\n     * 农历24节气\n     */\n    private final static String[] mSolarTerm = {\n            \"小寒\", \"大寒\", \"立春\", \"雨水\", \"惊蛰\", \"春分\",\n            \"清明\", \"谷雨\", \"立夏\", \"小满\", \"芒种\", \"夏至\",\n            \"小暑\", \"大暑\", \"立秋\", \"处暑\", \"白露\", \"秋分\",\n            \"寒露\", \"霜降\", \"立冬\", \"小雪\", \"大雪\", \"冬至\"\n    };\n\n    /**\n     * 返回24节气\n     */\n    public static String getTermString(int solarYear, int solarMonth, int solarDay) {\n        String termString = \"\";\n        if (getSolarTermDay(solarYear, solarMonth * 2) == solarDay) {\n            termString = mSolarTerm[solarMonth * 2];\n        } else if (getSolarTermDay(solarYear, solarMonth * 2 + 1) == solarDay) {\n            termString = mSolarTerm[solarMonth * 2 + 1];\n        }\n        return termString;\n    }\n\n    /**\n     * 返回公历年节气的日期\n     *\n     * @param solarYear 指定公历年份(数字)\n     * @param index     指定节气序号(数字,0从小寒算起)\n     * @return 日期(数字, 所在月份的第几天)\n     */\n    private static int getSolarTermDay(int solarYear, int index) {\n        return getUTCDay(getSolarTermCalendar(solarYear, index));\n    }\n\n    /**\n     * 返回公历年节气的日期\n     *\n     * @param solarYear 指定公历年份(数字)\n     * @param index     指定节气序号(数字,0从小寒算起)\n     * @return 日期(数字, 所在月份的第几天)\n     */\n    private static Date getSolarTermCalendar(int solarYear, int index) {\n        long l = (long) 31556925974.7 * (solarYear - 1900)\n                + solarTermInfo[index] * 60000L;\n        l = l + UTC(1900, 0, 6, 2, 5, 0);\n        return new Date(l);\n    }\n\n    /**\n     * 返回全球标准时间 (UTC) (或 GMT) 的 1970 年 1 月 1 日到所指定日期之间所间隔的毫秒数。\n     *\n     * @param y   指定年份\n     * @param m   指定月份\n     * @param d   指定日期\n     * @param h   指定小时\n     * @param min 指定分钟\n     * @param sec 指定秒数\n     * @return 全球标准时间 (UTC) (或 GMT) 的 1970 年 1 月 1 日到所指定日期之间所间隔的毫秒数\n     */\n    @SuppressWarnings(\"all\")\n    private static synchronized long UTC(int y, int m, int d, int h, int min, int sec) {\n        makeUTCCalendar();\n        synchronized (utcCal) {\n            utcCal.clear();\n            utcCal.set(y, m, d, h, min, sec);\n            return utcCal.getTimeInMillis();\n        }\n    }\n\n    private static GregorianCalendar utcCal = null;\n\n    /**\n     * 取 Date 对象中用全球标准时间 (UTC) 表示的日期\n     *\n     * @param date 指定日期\n     * @return UTC 全球标准时间 (UTC) 表示的日期\n     */\n    @SuppressWarnings(\"SynchronizeOnNonFinalField\")\n    private static synchronized int getUTCDay(Date date) {\n        makeUTCCalendar();\n        synchronized (utcCal) {\n            utcCal.clear();\n            utcCal.setTimeInMillis(date.getTime());\n            return utcCal.get(java.util.Calendar.DAY_OF_MONTH);\n        }\n    }\n\n    private static void makeUTCCalendar() {\n        if (utcCal == null) {\n            utcCal = new GregorianCalendar(TimeZone.getTimeZone(\"UTC\"));\n        }\n    }\n\n\n    /**\n     * 检查节气是否加1 ，例如青梅是4号还是5号\n     *\n     * @param year 今年\n     * @return 检查节气偏移量\n     */\n    @SuppressWarnings(\"all\")\n    static int getTermsOffset(int year) {\n        boolean isLeapYear = isLeapYear(year);\n        int d = getWinterSolstice(year - 1);//获取去年冬至是21还是22，农历\n        if (d == 22 && isLeapYear) return 2;//几百年才几次出现清明是6号\n        if (d == 22) return 1;\n        return 0;\n    }\n\n    /**\n     * 判断是否闰年\n     *\n     * @param year year\n     * @return 是否闰年\n     */\n    private static boolean isLeapYear(int year) {\n        return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);\n    }\n\n    private final static double D = 0.2422;\n    private final static double C = 21.94;// (year*D + C) - leap 20世纪C=22.60\n\n    /**\n     * 冬至是每年的第几日 21 or 22\n     */\n    private static int getWinterSolstice(int year) {\n        int dYear = Integer.parseInt(String.valueOf(year).substring(2, 4));\n        return (int) (dYear * D + C - (dYear / 4));\n    }\n\n\n    /**\n     * 获取农历节日\n     *\n     * @param year  年\n     * @param month 月\n     * @param day   日\n     * @return 农历节日\n     */\n    public static String getLunarText(int year, int month, int day) {\n        String termText = LunarCalendar.getTermString(year, month - 1, day);\n        String solar = LunarCalendar.getSolarCalendar(month, day);\n        if (!TextUtils.isEmpty(solar))\n            return solar;\n        if (!TextUtils.isEmpty(termText))\n            return termText;\n        return getLunar(year, month, day);\n    }\n\n\n    public static String getLunar(int year, int month, int day) {\n        int[] lunar = LunarCalendar.solarToLunar(year, month, day);\n        String festival = getTraditionFestivalText(lunar[0], lunar[1], lunar[2]);\n        if (!TextUtils.isEmpty(festival))\n            return festival;\n        return LunarCalendar.numToChinese(lunar[1], lunar[2]);\n    }\n\n\n}\n"
  },
  {
    "path": "calendar/src/main/java/com/bin/david/calendar/TextDrawFormat.java",
    "content": "package com.bin.david.calendar;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.text.TextUtils;\n\n\n/**\n * Created by huang on 2017/11/22.\n */\n\npublic abstract class TextDrawFormat implements CalendarView.IDrawFormat {\n\n    private boolean isDrawLunar;\n    private int interval = 5;\n    public static final int FESTIVAL = 2; //节日\n\n    public static final int SOLAR = 1; //节气\n\n    public static final int DAY  = 0; //普通日子\n\n    @Override\n    public void onClick(CalendarView calendarView,CalendarView.Cell cell) {\n\n    }\n\n\n    @Override\n    public void onDraw(CalendarView calendarView, Canvas canvas, CalendarView.Cell cell, Rect rect, Paint paint) {\n        int type = getDateType(calendarView,cell);\n        onDrawBackground(canvas,type,rect,paint);\n        paint.setTextSize(calendarView.getDefaultTextSize());\n        paint.setColor(calendarView.getDefaultTextColor());\n        onDrawBefore(canvas,type,rect,paint);\n        if(isDraw(type)) {\n            drawText(calendarView, canvas,type, cell, rect, paint);\n        }\n        onDrawOver(canvas,type,rect,paint);\n    }\n\n    //绘制背景\n    public void onDrawBackground(Canvas canvas,int type,Rect rect, Paint paint){\n\n    }\n\n    //绘制公历之前 可以设置公历字体和颜色\n    public void onDrawBefore(Canvas canvas,int type,Rect rect, Paint paint){\n\n    }\n\n    //绘制农历之前 可以用来绘制背景和改变字体大小颜色\n    public void onDrawLunarBefore(Canvas canvas,int type,Rect rect,int dayLevel,Paint paint){\n\n    }\n    //绘制之后\n    public void onDrawOver(Canvas canvas,int type,Rect rect, Paint paint){\n\n    }\n\n    public abstract boolean isDraw(int type);\n\n    public  String getContent(CalendarView.Cell cell,int type){\n       return cell.getDate().day + \"\";\n    }\n\n\n\n    private void drawText(CalendarView calendarView,Canvas canvas,int type, CalendarView.Cell cell, Rect rect, Paint paint) {\n        paint.setStyle(Paint.Style.FILL);\n        paint.setTextAlign(Paint.Align.CENTER);\n        if(isDrawLunar) {\n            //绘制公历\n            CustomDate date = cell.getDate();\n            canvas.drawText(getContent(cell,getDateType(calendarView,cell)), rect.centerX(),\n                    CalendarView.getTextCenterY(rect.centerY()-interval, paint), paint);\n            int textHeight = CalendarView.getTextHeight(paint);\n            //绘制农历\n            int dayLevel = DAY;\n            String lunar = LunarCalendar.getSolarCalendar(date.month,date.day);\n            if(!TextUtils.isEmpty(lunar)){\n                dayLevel = FESTIVAL;\n            }else {\n                 lunar = LunarCalendar.getTermString(date.year, date.month - 1, date.day);\n                if (!TextUtils.isEmpty(lunar)) {\n                    dayLevel = SOLAR;\n                }else{\n                     lunar = LunarCalendar.getLunar(date.year,date.month,date.day);\n                }\n            }\n            onDrawLunarBefore(canvas,type,rect,dayLevel,paint);\n            canvas.drawText(lunar,\n                    rect.centerX(),\n                    CalendarView.getTextCenterY(rect.centerY()+textHeight/2, paint), paint);\n        }else{\n            canvas.drawText(getContent(cell,getDateType(calendarView,cell)), rect.centerX(),\n                    CalendarView.getTextCenterY(rect.centerY(), paint), paint);\n        }\n    }\n\n    public boolean isDrawLunar() {\n        return isDrawLunar;\n    }\n\n    public void setDrawLunar(boolean drawLunar) {\n        isDrawLunar = drawLunar;\n    }\n\n    public int getInterval() {\n        return interval;\n    }\n\n    public void setInterval(int interval) {\n        this.interval = interval;\n    }\n\n    @Override\n    public void onDraw(CalendarView calendarView) {\n\n    }\n}\n\n"
  },
  {
    "path": "calendar/src/main/res/layout/item_month_calendar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.bin.david.calendar.CalendarMonthView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    app:baseTextSize=\"14sp\">\n\n</com.bin.david.calendar.CalendarMonthView>"
  },
  {
    "path": "calendar/src/main/res/layout/item_week_calendar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.bin.david.calendar.CalendarWeekView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n\n    app:baseTextSize=\"14sp\">\n\n</com.bin.david.calendar.CalendarWeekView>"
  },
  {
    "path": "calendar/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"CalendarView\">\n        <attr name=\"baseTextColor\" format=\"color\"/>\n        <attr name=\"baseTextSize\" format=\"dimension\"/>\n        <attr name=\"rowHeight\" format=\"dimension\"/>\n    </declare-styleable>\n\n</resources>"
  },
  {
    "path": "calendar/src/main/res/values/dimens.xml",
    "content": "<resources>\n\n\n\n\n    <dimen name=\"calendar_view_height\">40dp</dimen>\n\n\n\n</resources>"
  },
  {
    "path": "calendar/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">calendar</string>\n</resources>\n"
  },
  {
    "path": "calendar/src/test/java/com/bin/david/calendar/ExampleUnitTest.java",
    "content": "package com.bin.david.calendar;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.jar",
    "content": ", Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_he-il_9f35194c631bfc71, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_hu-hu_c3f1884f31bceb5c (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_hu-hu_a285f1f2610cca9f, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_it-it_66a8fe4e248f01be (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_it-it_453d67f153dee101, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_ja-jp_08ce7d5b17aa1399 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_ja-jp_e762e6fe46f9f2dc, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_ko-kr_ac385a100a1adaaf (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_ko-kr_8accc3b3396ab9f2, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_nb-no_94cadb44e240066b (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_nb-no_735f44e8118fe5ae, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_nl-nl_930a2682e36c1040 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_nl-nl_719e902612bbef83, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_pl-pl_d9468104c88e7df4 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_pl-pl_b7daeaa7f7de5d37, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_pt-br_db9a6ba8c71811d8 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_pt-br_ba2ed54bf667f11b, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_pt-pt_dc7c3b14c68781b4 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_pt-pt_bb10a4b7f5d760f7, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_ru-ru_231f4cd8ab690fe0 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_ru-ru_01b3b67bdab8ef23, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_sv-se_bf1a374da2921a3b (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_sv-se_9daea0f0d1e1f97e, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_tr-tr_68278194914e1c2c (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_tr-tr_46bbeb37c09dfb6f, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_zh-cn_39849f924185ee4b (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_zh-cn_1819093570d5cd8e, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_zh-tw_3d80dce83ef6cabb (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_zh-tw_1c15468b6e46a9fe, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-msauditevtlog_31bf3856ad364e35_0.0.0.0_none_473b0b7f78f52228 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-msauditevtlog_31bf3856ad364e35_6.1.7601.23142_none_25cf7522a845016b, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ncrypt-dll_31bf3856ad364e35_0.0.0.0_none_ddd6e6c2f223bc0f (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ncrypt-dll_31bf3856ad364e35_6.1.7601.23142_none_bc6b506621739b52, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ntdll_31bf3856ad364e35_0.0.0.0_none_d8cf6f72fcb55982 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ntdll_31bf3856ad364e35_6.1.7601.23142_none_b763d9162c0538c5, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_cs-cz_9174900bcf701166 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_cs-cz_7008f9aefebff0a9, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_de-de_2bda056ec78c61ff (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_de-de_0a6e6f11f6dc4142, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_en-us_d4cadb67b66a6dc4 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_en-us_b35f450ae5ba4d07, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_es-es_d496384bb6915f69 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_es-es_b32aa1eee5e13eac, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_fr-fr_774dae4aa96375cb (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_fr-fr_55e217edd8b3550e, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_hu-hu_bebe2e928dc344e7 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_hu-hu_9d529835bd13242a, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_it-it_6175a49180955b49 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_it-it_400a0e34afe53a8c, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_ja-jp_039b239e73b06d24 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_ja-jp_e22f8d41a3004c67, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_ko-kr_a70500536621343a (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_ko-kr_859969f69571137d, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_nl-nl_8dd6ccc63f7269cb (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_nl-nl_6c6b36696ec2490e, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_pl-pl_d41327482494d77f (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_pl-pl_b2a790eb53e4b6c2, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_pt-br_d66711ec231e6b63 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_pt-br_b4fb7b8f526e4aa6, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_pt-pt_d748e158228ddb3f (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_pt-pt_b5dd4afb51ddba82, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_ru-ru_1debf31c076f696b (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_ru-ru_fc805cbf36bf48ae, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_sv-se_b9e6dd90fe9873c6 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_sv-se_987b47342de85309, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_tr-tr_62f427d7ed5475b7 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_tr-tr_4188917b1ca454fa, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_zh-cn_345145d59d8c47d6 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_zh-cn_12e5af78ccdc2719, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_0.0.0.0_zh-tw_384d832b9afd2446 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc.resources_31bf3856ad364e35_6.1.7601.23142_zh-tw_16e1ecceca4d0389, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc_31bf3856ad364e35_0.0.0.0_none_5d39df9b63de6da9 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc_31bf3856ad364e35_6.1.7601.23142_none_3bce493e932e4cec, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-ocspsvc-webproxy_31bf3856ad364e35_0.0.0.0_none_64994d221a2d0328 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-ocspsvc-webproxy_31bf3856ad364e35_6.1.7601.23142_none_432db6c5497ce26b, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-os-kernel_31bf3856ad364e35_0.0.0.0_none_ec28f2d1b4aabfd4 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-os-kernel_31bf3856ad364e35_6.1.7601.23142_none_cabd5c74e3fa9f17, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-rpc-http_31bf3856ad364e35_0.0.0.0_none_1ff17e213fdb971a (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.17514\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-rpc-http_31bf3856ad364e35_6.1.7601.23142_none_fe85e7c46f2b765d, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-rpc-local_31bf3856ad364e35_0.0.0.0_none_33f33048459bfccb (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-rpc-local_31bf3856ad364e35_6.1.7601.23142_none_128799eb74ebdc0e, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-security-credssp_31bf3856ad364e35_0.0.0.0_none_43b0c2a0a217b23d (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-security-credssp_31bf3856ad364e35_6.1.7601.23142_none_22452c43d1679180, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-security-digest_31bf3856ad364e35_0.0.0.0_none_bac5dc487d3cc135 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-security-digest_31bf3856ad364e35_6.1.7601.23142_none_995a45ebac8ca078, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-security-kerberos_31bf3856ad364e35_0.0.0.0_none_66cf6e5cb1553d64 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-security-kerberos_31bf3856ad364e35_6.1.7601.23142_none_4563d7ffe0a51ca7, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-security-ntlm_31bf3856ad364e35_0.0.0.0_none_fcab7e0463127084 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-security-ntlm_31bf3856ad364e35_6.1.7601.23142_none_db3fe7a792624fc7, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-security-schannel_31bf3856ad364e35_0.0.0.0_none_a20edc3f55ca842d (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-security-schannel_31bf3856ad364e35_6.1.7601.23142_none_80a345e2851a6370, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-smb10-minirdr_31bf3856ad364e35_0.0.0.0_none_089d1cba4bf65af1 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-smb10-minirdr_31bf3856ad364e35_6.1.7601.23142_none_e731865d7b463a34, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-smb20-minirdr_31bf3856ad364e35_0.0.0.0_none_0ad386cc8a4d8e62 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-smb20-minirdr_31bf3856ad364e35_6.1.7601.23142_none_e967f06fb99d6da5, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-smbminirdr_31bf3856ad364e35_0.0.0.0_none_ff89fe6651a51c8f (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-smbminirdr_31bf3856ad364e35_6.1.7601.23142_none_de1e680980f4fbd2, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-smss_31bf3856ad364e35_0.0.0.0_none_2c33392e19b94d26 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-smss_31bf3856ad364e35_6.1.7601.23142_none_0ac7a2d149092c69, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-systemrestore-main_31bf3856ad364e35_0.0.0.0_none_c6d86118b3c6ab95 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-systemrestore-main_31bf3856ad364e35_6.1.7601.23142_none_a56ccabbe3168ad8, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-tracedatahelper_31bf3856ad364e35_0.0.0.0_none_7c5b6193d2b5f52f (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.18939\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-tracedatahelper_31bf3856ad364e35_6.1.7601.23142_none_5aefcb370205d472, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-winsrv_31bf3856ad364e35_0.0.0.0_none_367727d39cdce317 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-winsrv_31bf3856ad364e35_6.1.7601.23142_none_150b9176cc2cc25a, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: amd64_microsoft-windows-wow64_31bf3856ad364e35_0.0.0.0_none_e81e593ad7d6df35 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-wow64_31bf3856ad364e35_6.1.7601.23142_none_c6b2c2de0726be78, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-appid_31bf3856ad364e35_0.0.0.0_none_e1994bcee70fbb6d (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.18741\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-appid_31bf3856ad364e35_6.1.7601.23142_none_c02db572165f9ab0, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-csrsrv_31bf3856ad364e35_0.0.0.0_none_53d47288da461130 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-csrsrv_31bf3856ad364e35_6.1.7601.23142_none_3268dc2c0995f073, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-kernel32_31bf3856ad364e35_0.0.0.0_none_1e0b20c48b33f815 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-kernel32_31bf3856ad364e35_6.1.7601.23142_none_fc9f8a67ba83d758, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-kernelbase_31bf3856ad364e35_0.0.0.0_none_b14fb3d6e97c8001 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-kernelbase_31bf3856ad364e35_6.1.7601.23142_none_8fe41d7a18cc5f44, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-lsa_31bf3856ad364e35_0.0.0.0_none_3097c64591b3a79d (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-lsa_31bf3856ad364e35_6.1.7601.23142_none_0f2c2fe8c10386e0, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-ntdll_31bf3856ad364e35_0.0.0.0_none_e32419c531161b7d (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-ntdll_31bf3856ad364e35_6.1.7601.23142_none_c1b883686065fac0, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-rpc-local_31bf3856ad364e35_0.0.0.0_none_3e47da9a79fcbec6 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-rpc-local_31bf3856ad364e35_6.1.7601.23142_none_1cdc443da94c9e09, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-security-digest_31bf3856ad364e35_0.0.0.0_none_c51a869ab19d8330 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-security-digest_31bf3856ad364e35_6.1.7601.23142_none_a3aef03de0ed6273, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-security-kerberos_31bf3856ad364e35_0.0.0.0_none_712418aee5b5ff5f (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-security-kerberos_31bf3856ad364e35_6.1.7601.23142_none_4fb882521505dea2, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-security-ntlm_31bf3856ad364e35_0.0.0.0_none_070028569773327f (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-security-ntlm_31bf3856ad364e35_6.1.7601.23142_none_e59491f9c6c311c2, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-security-schannel_31bf3856ad364e35_0.0.0.0_none_ac6386918a2b4628 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-security-schannel_31bf3856ad364e35_6.1.7601.23142_none_8af7f034b97b256b, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-smss_31bf3856ad364e35_0.0.0.0_none_3687e3804e1a0f21 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-smss_31bf3856ad364e35_6.1.7601.23142_none_151c4d237d69ee64, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-systemrestore-main_31bf3856ad364e35_0.0.0.0_none_d12d0b6ae8276d90 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-systemrestore-main_31bf3856ad364e35_6.1.7601.23142_none_afc1750e17774cd3, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-winsrv_31bf3856ad364e35_0.0.0.0_none_40cbd225d13da512 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-winsrv_31bf3856ad364e35_6.1.7601.23142_none_1f603bc9008d8455, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: wow64_microsoft-windows-wow64_31bf3856ad364e35_0.0.0.0_none_f273038d0c37a130 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: wow64_microsoft-windows-wow64_31bf3856ad364e35_6.1.7601.23142_none_d1076d303b878073, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-advapi32_31bf3856ad364e35_0.0.0.0_none_07224757ceabf4e6 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-advapi32_31bf3856ad364e35_6.1.7601.23142_none_e5b6b0fafdfbd429, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_ar-sa_f3f9a91822fc6b89 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_ar-sa_d28e12bb524c4acc, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_cs-cz_4543013c0104990b (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_cs-cz_23d76adf3054784e, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_da-dk_e27ce162f74a950a (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_da-dk_c1114b06269a744d, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_de-de_dfa8769ef920e9a4 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_de-de_be3ce0422870c8e7, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_el-gr_883ea431e8365232 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_el-gr_66d30dd517863175, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_en-us_88994c97e7fef569 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_en-us_672db63b174ed4ac, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_es-es_8864a97be825e70e (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_es-es_66f9131f1775c651, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_fi-fi_277fae28dd3fd938 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_fi-fi_061417cc0c8fb87b, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_fr-fr_2b1c1f7adaf7fd70 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_fr-fr_09b0891e0a47dcb3, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_he-il_6f3bc71cc166fe5e (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_he-il_4dd030bff0b6dda1, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_hu-hu_728c9fc2bf57cc8c (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_hu-hu_51210965eea7abcf, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_it-it_154415c1b229e2ee (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_it-it_f3d87f64e179c231, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_ja-jp_b76994cea544f4c9 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_ja-jp_95fdfe71d494d40c, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_ko-kr_5ad3718397b5bbdf (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_ko-kr_3967db26c7059b22, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_nb-no_4365f2b86fdae79b (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_nb-no_21fa5c5b9f2ac6de, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_nl-nl_41a53df67106f170 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_nl-nl_2039a799a056d0b3, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_pl-pl_87e1987856295f24 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_pl-pl_6676021b85793e67, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_pt-br_8a35831c54b2f308 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_pt-br_68c9ecbf8402d24b, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_pt-pt_8b175288542262e4 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_pt-pt_69abbc2b83724227, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_ru-ru_d1ba644c3903f110 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_ru-ru_b04ecdef6853d053, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_sv-se_6db54ec1302cfb6b (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_sv-se_4c49b8645f7cdaae, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_tr-tr_16c299081ee8fd5c (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_tr-tr_f55702ab4e38dc9f, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_zh-cn_e81fb705cf20cf7b (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.18833\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_zh-cn_c6b420a8fe70aebe, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_0.0.0.0_zh-tw_ec1bf45bcc91abeb (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..ityclient.resources_31bf3856ad364e35_6.1.7601.23142_zh-tw_cab05dfefbe18b2e, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-c..tionauthorityclient_31bf3856ad364e35_0.0.0.0_none_fb57ab2984d1c45c (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.18833\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-c..tionauthorityclient_31bf3856ad364e35_6.1.7601.23142_none_d9ec14ccb421a39f, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-cryptbase_31bf3856ad364e35_0.0.0.0_none_893fcb25f624336b (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-cryptbase_31bf3856ad364e35_6.1.7601.23142_none_67d434c9257412ae, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_ar-sa_e93ff620dd041923 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_ar-sa_c7d45fc40c53f866, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_cs-cz_3a894e44bb0c46a5 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_cs-cz_191db7e7ea5c25e8, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_da-dk_d7c32e6bb15242a4 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_da-dk_b657980ee0a221e7, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_de-de_d4eec3a7b328973e (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_de-de_b3832d4ae2787681, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_el-gr_7d84f13aa23dffcc (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_el-gr_5c195addd18ddf0f, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_en-us_7ddf99a0a206a303 (6.1.7601.23142), elevation:2, lower version revision holder: 6.1.7601.19135\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_en-us_5c740343d1568246, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_es-es_7daaf684a22d94a8 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_es-es_5c3f6027d17d73eb, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_fi-fi_1cc5fb31974786d2 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_fi-fi_fb5a64d4c6976615, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_fr-fr_20626c8394ffab0a (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_fr-fr_fef6d626c44f8a4d, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_he-il_648214257b6eabf8 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_he-il_43167dc8aabe8b3b, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_hu-hu_67d2eccb795f7a26 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_hu-hu_4667566ea8af5969, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_it-it_0a8a62ca6c319088 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_it-it_e91ecc6d9b816fcb, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_ja-jp_acafe1d75f4ca263 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_6.1.7601.23142_ja-jp_8b444b7a8e9c81a6, elevate: 2, applicable(true/false): 0\n2017-04-18 10:14:55, Info                  CBS    Appl: Selfupdate, Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e35_0.0.0.0_ko-kr_5019be8c51bd6979 (6.1.7601.23142), elevation:2, lower version revision holder: 0.0.0.0\n2017-04-18 10:14:55, Info                  CBS    Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: x86_microsoft-windows-m..ditevtlog.resources_31bf3856ad364e3"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Apr 12 10:38:55 CST 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": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\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": "settings.gradle",
    "content": "include ':app', ':calendar'\n"
  }
]