Showing preview only (228K chars total). Download the full file or copy to clipboard to get everything.
Repository: huangyanbin/CalendarView
Branch: master
Commit: 99e43b0d3970
Files: 75
Total size: 202.4 KB
Directory structure:
gitextract_9beznimz/
├── .gitignore
├── .idea/
│ ├── compiler.xml
│ ├── copyright/
│ │ └── profiles_settings.xml
│ ├── gradle.xml
│ ├── markdown-navigator/
│ │ └── profiles_settings.xml
│ ├── markdown-navigator.xml
│ ├── misc.xml
│ ├── misc.xml___jb_old___
│ ├── modules.xml
│ ├── runConfigurations.xml
│ └── vcs.xml
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── palmwifi/
│ │ └── testcal/
│ │ └── ExampleInstrumentedTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── palmwifi/
│ │ │ └── testcal/
│ │ │ ├── CalendarActivity.java
│ │ │ ├── CalendarMonthActivity.java
│ │ │ ├── CalendarWeekActivity.java
│ │ │ ├── DashBoardActivity.java
│ │ │ ├── HomeActivity.java
│ │ │ ├── RingActivity.java
│ │ │ ├── calendar/
│ │ │ │ ├── CalendarMonthView.java
│ │ │ │ ├── CalendarView.java
│ │ │ │ ├── CalendarViewBuilder.java
│ │ │ │ ├── CalendarViewPagerAdapter.java
│ │ │ │ ├── CalendarViewPagerListener.java
│ │ │ │ ├── CustomDate.java
│ │ │ │ ├── DateUtil.java
│ │ │ │ ├── OnCalenderListener.java
│ │ │ │ └── RecordState.java
│ │ │ ├── dash/
│ │ │ │ ├── DashboardView.java
│ │ │ │ └── RingView.java
│ │ │ ├── newcalendar/
│ │ │ │ ├── CustomCalendarAdapter.java
│ │ │ │ └── CustomTextDrawFormat.java
│ │ │ └── utils/
│ │ │ └── DensityUtils.java
│ │ └── res/
│ │ ├── layout/
│ │ │ ├── ac_dash_broad.xml
│ │ │ ├── ac_home.xml
│ │ │ ├── ac_ring.xml
│ │ │ ├── activity_calendar.xml
│ │ │ └── activity_main.xml
│ │ └── values/
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test/
│ └── java/
│ └── com/
│ └── palmwifi/
│ └── testcal/
│ └── ExampleUnitTest.java
├── build.gradle
├── calendar/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── bin/
│ │ └── david/
│ │ └── calendar/
│ │ └── ExampleInstrumentedTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── bin/
│ │ │ └── david/
│ │ │ └── calendar/
│ │ │ ├── CalendarAdapter.java
│ │ │ ├── CalendarMonthView.java
│ │ │ ├── CalendarRecyclerHelper.java
│ │ │ ├── CalendarView.java
│ │ │ ├── CalendarWeekView.java
│ │ │ ├── CustomDate.java
│ │ │ ├── DateUtil.java
│ │ │ ├── LunarCalendar.java
│ │ │ └── TextDrawFormat.java
│ │ └── res/
│ │ ├── layout/
│ │ │ ├── item_month_calendar.xml
│ │ │ └── item_week_calendar.xml
│ │ └── values/
│ │ ├── attrs.xml
│ │ ├── dimens.xml
│ │ └── strings.xml
│ └── test/
│ └── java/
│ └── com/
│ └── bin/
│ └── david/
│ └── calendar/
│ └── ExampleUnitTest.java
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild
================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>
================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
<component name="CopyrightManager">
<settings default="" />
</component>
================================================
FILE: .idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/calendar" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
================================================
FILE: .idea/markdown-navigator/profiles_settings.xml
================================================
<component name="MarkdownNavigator.ProfileManager">
<settings default="" pdf-export="" />
</component>
================================================
FILE: .idea/markdown-navigator.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownProjectSettings">
<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">
<PanelProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" />
</PanelProvider>
</PreviewSettings>
<ParserSettings gitHubSyntaxChange="false">
<PegdownExtensions>
<option name="ABBREVIATIONS" value="false" />
<option name="ANCHORLINKS" value="true" />
<option name="ASIDE" value="false" />
<option name="ATXHEADERSPACE" value="true" />
<option name="AUTOLINKS" value="true" />
<option name="DEFINITIONS" value="false" />
<option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" />
<option name="FENCED_CODE_BLOCKS" value="true" />
<option name="FOOTNOTES" value="false" />
<option name="HARDWRAPS" value="false" />
<option name="HTML_DEEP_PARSER" value="false" />
<option name="INSERTED" value="false" />
<option name="QUOTES" value="false" />
<option name="RELAXEDHRULES" value="true" />
<option name="SMARTS" value="false" />
<option name="STRIKETHROUGH" value="true" />
<option name="SUBSCRIPT" value="false" />
<option name="SUPERSCRIPT" value="false" />
<option name="SUPPRESS_HTML_BLOCKS" value="false" />
<option name="SUPPRESS_INLINE_HTML" value="false" />
<option name="TABLES" value="true" />
<option name="TASKLISTITEMS" value="true" />
<option name="TOC" value="false" />
<option name="WIKILINKS" value="true" />
</PegdownExtensions>
<ParserOptions>
<option name="COMMONMARK_LISTS" value="true" />
<option name="DUMMY" value="false" />
<option name="EMOJI_SHORTCUTS" value="true" />
<option name="FLEXMARK_FRONT_MATTER" value="false" />
<option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" />
<option name="GFM_TABLE_RENDERING" value="true" />
<option name="GITBOOK_URL_ENCODING" value="false" />
<option name="GITHUB_EMOJI_URL" value="false" />
<option name="GITHUB_LISTS" value="false" />
<option name="GITHUB_WIKI_LINKS" value="true" />
<option name="JEKYLL_FRONT_MATTER" value="false" />
<option name="SIM_TOC_BLANK_LINE_SPACER" value="true" />
</ParserOptions>
</ParserSettings>
<HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true">
<GeneratorProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" />
</GeneratorProvider>
<headerTop />
<headerBottom />
<bodyTop />
<bodyBottom />
</HtmlSettings>
<CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssTextEnabled="false" isDynamicPageWidth="true">
<StylesheetProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" />
</StylesheetProvider>
<ScriptProviders />
<cssText />
</CssSettings>
<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" />
<LinkMapSettings>
<textMaps />
</LinkMapSettings>
</component>
</project>
================================================
FILE: .idea/misc.xml___jb_old___
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<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">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
<component name="SvnConfiguration" myUseAcceleration="nothing">
<configuration useDefault="false">C:\Users\David\AppData\Roaming\Subversion</configuration>
</component>
<component name="masterDetails">
<states>
<state key="ProjectJDKs.UI">
<settings>
<last-edited>1.8</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>
================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/CalendarView.iml" filepath="$PROJECT_DIR$/CalendarView.iml" />
<module fileurl="file://E:\code\android project\CalendarView\CalendarView.iml" filepath="E:\code\android project\CalendarView\CalendarView.iml" />
<module fileurl="file://E:\code\android project\CalendarView\TestCal.iml" filepath="E:\code\android project\CalendarView\TestCal.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://E:\code\android project\CalendarView\app\app.iml" filepath="E:\code\android project\CalendarView\app\app.iml" />
<module fileurl="file://$PROJECT_DIR$/calendar/calendar.iml" filepath="$PROJECT_DIR$/calendar/calendar.iml" />
</modules>
</component>
</project>
================================================
FILE: .idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>
================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
================================================
FILE: README.md
================================================
CalendarView
============
##### 包含三个自定义View 日历仪表盘 圆盘
---------------------------------------
> 这是使用RecyclerView做的日历,比之前ViewPager不管从逻辑,功能更加强大,实现更加简单。之前ViewPager的日历没有功能逻辑分离,这次提供全新IDrawFormat接口,比如你需要针对某些日期增加标签,你就可以实现IDrawFormat,然后addDrawFormat就可以了,这样就实现标签和其他逻辑混合导致逻辑混乱,按顺序多层绘制,默认只提供文字层(日历日期和农历),但也需要自己add。你可以设置先后顺序,完美实现所有功能。可以支持任何样式。当前前提你会一点Android canvas绘制。月模式也完成,以后会提供小米日历类似功能。


##### 日历 支持翻页,点击日期,日期状态 ###

##### 仪表盘 可根据配置改变圆弧,设置字体颜色和配置颜色,指针大小,字体大小打开动画等 ###

##### 圆盘 可根据配置改变个数,支持点击单个圆弧回调,设置字体和配置颜色,分割线,阴影打开动画等 ###

================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "26.0.2"
aaptOptions {
cruncherEnabled = false
useNewCruncher = false
}
defaultConfig {
applicationId "com.palmwifi.testcal"
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha9'
testCompile 'junit:junit:4.12'
compile project(':calendar')
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\David\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: app/src/androidTest/java/com/palmwifi/testcal/ExampleInstrumentedTest.java
================================================
package com.palmwifi.testcal;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.palmwifi.testcal", appContext.getPackageName());
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.palmwifi.testcal">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".HomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".CalendarActivity"/>
<activity android:name=".DashBoardActivity"/>
<activity android:name=".RingActivity"/>
<activity android:name=".CalendarMonthActivity"/>
<activity android:name=".CalendarWeekActivity"/>
</application>
</manifest>
================================================
FILE: app/src/main/java/com/palmwifi/testcal/CalendarActivity.java
================================================
package com.palmwifi.testcal;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.palmwifi.testcal.calendar.CalendarView;
import com.palmwifi.testcal.calendar.CalendarViewBuilder;
import com.palmwifi.testcal.calendar.CalendarViewPagerAdapter;
import com.palmwifi.testcal.calendar.CalendarViewPagerListener;
import com.palmwifi.testcal.calendar.CustomDate;
import com.palmwifi.testcal.calendar.OnCalenderListener;
import com.palmwifi.testcal.calendar.RecordState;
public class CalendarActivity extends AppCompatActivity implements OnCalenderListener,View.OnClickListener {
private ViewPager monthViewPager;
private TextView mDateTv;
private CalendarView[] monthViews;
private CalendarViewPagerListener monthPagerListener;
private int cellHeight;
private ImageView leftImg;
private ImageView rightImg;
private int rows;
private Handler mHandler = new Handler();
private CustomDate mShowDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
monthViewPager = (ViewPager) findViewById(R.id.viewpager);
mDateTv = (TextView) findViewById(R.id.tv_show_date);
monthViews = CalendarViewBuilder.createMonthCalendarViews(this, 5,false, this);
leftImg = (ImageView) findViewById(R.id.img_cal_left);
rightImg = (ImageView) findViewById(R.id.img_cal_right);
setViewPager();
leftImg.setOnClickListener(this);
rightImg.setOnClickListener(this);
}
private void setViewPager() {
CalendarViewPagerAdapter<CalendarView> viewPagerAdapter = new CalendarViewPagerAdapter<>(monthViews);
monthViewPager.setAdapter(viewPagerAdapter);
monthViewPager.setCurrentItem(498);
monthPagerListener = new CalendarViewPagerListener(monthViewPager, viewPagerAdapter);
monthViewPager.addOnPageChangeListener(monthPagerListener);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
monthViewPager.requestLayout();
}
}, 150);
}
@Override
public void clickDate(CustomDate date) {
Toast.makeText(this,"点击"+date.toString(),Toast.LENGTH_SHORT).show();
}
@Override
public void showDate(CustomDate date) {
if (mShowDate == null || !date.isSameDay(mShowDate)) {
mShowDate = date;
mDateTv.setText(date.year + "年" + date.month + "月");
}
}
@Override
public void onMeasureCellHeight(int cellSpace) {
cellHeight = cellSpace;
if (rows != 0) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) monthViewPager.getLayoutParams();
lp.height = rows * cellHeight;
monthViewPager.setLayoutParams(lp);
}
}
@Override
public void changeRowCount(int rows) {
this.rows = rows;
if (cellHeight != 0) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) monthViewPager.getLayoutParams();
lp.height = rows * cellHeight;
monthViewPager.setLayoutParams(lp);
}
}
@Override
public RecordState setSignDateStatus(CustomDate date) {
if (date.getYear() == 2017 && date.getMonth() <= 4) {
if (date.getDay() % 10 <= 3) {
return RecordState.Sign;
} else if (date.getDay() % 10 <= 6) {
return RecordState.Buckle;
} else {
return RecordState.UnSign;
}
}
return null;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.img_cal_left:
monthViewPager.setCurrentItem(monthViewPager.getCurrentItem()-1);
break;
case R.id.img_cal_right:
monthViewPager.setCurrentItem(monthViewPager.getCurrentItem()+1);
break;
}
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/CalendarMonthActivity.java
================================================
package com.palmwifi.testcal;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import com.bin.david.calendar.CalendarRecyclerHelper;
import com.bin.david.calendar.CalendarView;
import com.bin.david.calendar.CustomDate;
import com.palmwifi.testcal.newcalendar.CustomCalendarAdapter;
/**
* Created by huang on 2017/11/9.
*/
public class CalendarMonthActivity extends AppCompatActivity{
private RecyclerView recyclerView;
private TextView showTv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calendar);
showTv = (TextView) findViewById(R.id.tv_show_date);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
CalendarRecyclerHelper.init(this, recyclerView, new CustomCalendarAdapter(), new CalendarView.OnCalendarPageChanged() {
@Override
public void onPageChanged(CustomDate showDate) {
showTv.setText(showDate.year+"年"+showDate.month+"月");
}
});
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/CalendarWeekActivity.java
================================================
package com.palmwifi.testcal;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import com.bin.david.calendar.CalendarRecyclerHelper;
import com.bin.david.calendar.CalendarView;
import com.bin.david.calendar.CustomDate;
import com.palmwifi.testcal.newcalendar.CustomCalendarAdapter;
/**
* Created by huang on 2017/11/9.
*/
public class CalendarWeekActivity extends AppCompatActivity{
private RecyclerView recyclerView;
private TextView showTv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calendar);
showTv = (TextView) findViewById(R.id.tv_show_date);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
CalendarRecyclerHelper.init(this, recyclerView, new CustomCalendarAdapter(CustomCalendarAdapter.WEEK_MODE), new CalendarView.OnCalendarPageChanged() {
@Override
public void onPageChanged(CustomDate showDate) {
showTv.setText(showDate.year+"年"+showDate.month+"月");
}
});
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/DashBoardActivity.java
================================================
package com.palmwifi.testcal;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.palmwifi.testcal.dash.DashboardView;
/**
* Created by David on 2017/4/13.
*/
public class DashBoardActivity extends AppCompatActivity {
private DashboardView tempDashView;
private DashboardView humDashView;
private final static int invs[] = {35, 10, 35};
private final static int[] colorRes = {R.color.arc1, R.color.arc2, R.color.arc3};
private final static int invs1[] = {25, 50, 25};
private final static int[] colorRes1 = {R.color.arc21, R.color.arc22, R.color.arc23};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_dash_broad);
tempDashView = (DashboardView) findViewById(R.id.temp);
humDashView = (DashboardView) findViewById(R.id.humi);
String[] str = getResources().getStringArray(R.array.mult_temp_dash);
String[] str2 = getResources().getStringArray(R.array.mult_huim_dash);
tempDashView.initDash(-20, invs, str, "℃", colorRes);
humDashView.initDash(0, invs1, str2, "%", colorRes1);
tempDashView.setAngleWithAnim(30);
humDashView.setAngleWithAnim(70);
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/HomeActivity.java
================================================
package com.palmwifi.testcal;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
/**
* Created by David on 2017/5/10.
*/
public class HomeActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_home);
findViewById(R.id.btn_new_month_cal).setOnClickListener(this);
findViewById(R.id.btn_new_week_cal).setOnClickListener(this);
findViewById(R.id.btn_cal).setOnClickListener(this);
findViewById(R.id.btn_round_board).setOnClickListener(this);
findViewById(R.id.btn_dash_board).setOnClickListener(this);
findViewById(R.id.btn_dash_board).setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent i = null;
switch (v.getId()){
case R.id.btn_new_month_cal:
i = new Intent(this,CalendarMonthActivity.class); //日历
break;
case R.id.btn_new_week_cal:
i = new Intent(this,CalendarWeekActivity.class); //日历
break;
case R.id.btn_cal:
i = new Intent(this,CalendarActivity.class); //日历
break;
case R.id.btn_dash_board:
i = new Intent(this,DashBoardActivity.class); //仪表盘
break;
case R.id.btn_round_board:
i = new Intent(this,RingActivity.class); //圆盘
break;
}
if(i != null){
startActivity(i);
}
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/RingActivity.java
================================================
package com.palmwifi.testcal;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.palmwifi.testcal.dash.RingView;
/**
* Created by David on 2017/4/13.
*/
public class RingActivity extends AppCompatActivity {
private RingView tempDashView;
private RingView tempDashView2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_ring);
tempDashView = (RingView) findViewById(R.id.humi);
String[] str = {"差", "中", "好"};
int[] colors = {R.color.arc1, R.color.arc2, R.color.arc3};
tempDashView.setTotalSection(3);
tempDashView.setSelectPosition(1);
tempDashView.initDash(str,colors);
tempDashView.startAnim(800);
tempDashView2 = (RingView) findViewById(R.id.humi2);
tempDashView2.setTotalSection(5);
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarMonthView.java
================================================
package com.palmwifi.testcal.calendar;
import android.content.Context;
import android.util.AttributeSet;
public class CalendarMonthView extends CalendarView {
private static final int TOTAL_COL = 7;
private static final int TOTAL_ROW = 6;
public static CustomDate mShowDate;
public static CustomDate mClickDate;
public static CustomDate mClickHideDate;
private OnCalenderListener mCallBack;
public CalendarMonthView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CalendarMonthView(Context context, OnCalenderListener callBack) {
super(context);
this.mCallBack = callBack;
initDate();
}
public CalendarMonthView(Context context) {
super(context);
initDate();
}
@Override
protected void initDate() {
mShowDate = new CustomDate();
fillDate();
}
@Override
public void measureClickCell(int col, int row) {
if (col >= TOTAL_COL || row >= TOTAL_ROW)
return;
Cell cell = rows[row].cells[col];
if (cell == null || cell.state == State.PAST_MONTH_DAY || cell.state == State.NEXT_MONTH_DAY) {
return;
}
CustomDate date = cell.date;
mClickDate = date;
mClickHideDate = date;
fillMonthDate(false);
invalidate();
}
private void fillDate() {
fillMonthDate(true);
}
private void fillMonthDate(boolean isChangeClick) {
int monthDay = DateUtil.getCurrentMonthDay();
int lastMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month - 1);
int currentMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month);
int firstDayWeek = DateUtil.getWeekDayFromDate(mShowDate.year, mShowDate.month);
boolean isCurrentMonth = false;
if (DateUtil.isCurrentMonth(mShowDate)) {
isCurrentMonth = true;
if (isChangeClick) {
mClickHideDate = CustomDate.modifiDayForObject(mShowDate, monthDay, 0);
mClickDate = CustomDate.modifiDayForObject(mShowDate, monthDay, 0);
}
} else {
if (isChangeClick) {
if(isAutoClickFirstDay())
mClickDate = CustomDate.modifiDayForObject(mShowDate, 1, 0);
mClickHideDate = CustomDate.modifiDayForObject(mShowDate, monthDay, 0);
}
}
int day = 0;
for (int j = 0; j < TOTAL_ROW; j++) {
rows[j] = new Row(j);
for (int i = 0; i < TOTAL_COL; i++) {
int position = i + j * TOTAL_COL;
CustomDate date;
if (position >= firstDayWeek && position < firstDayWeek + currentMonthDays) {
day++;
if (day == currentMonthDays) {
int maxRow = j + 1;
if (mCallBack != null)
mCallBack.changeRowCount(maxRow);
}
date = CustomDate.modifiDayForObject(mShowDate, day, i);
RecordState state = getRecordDateState(date);
if (date.isSameDay(mClickDate)) {
mClickDate.setWeek(i);
if (mCallBack != null)
mCallBack.clickDate(date);
updateCellData(j, i, date, State.CLICK_DAY, state);
continue;
}
if(date.isSameDay(mClickHideDate)){
mClickHideDate.setWeek(i);
if (mCallBack != null)
mCallBack.showDate(date);
}
if (isCurrentMonth && day == monthDay) {
updateCellData(j, i, date, State.TODAY, state);
continue;
}
updateCellData(j, i, date, State.CURRENT_MONTH_DAY, state);
} else if (position < firstDayWeek) {
date = new CustomDate(mShowDate.year, mShowDate.month - 1, lastMonthDays - (firstDayWeek - position - 1), i);
updateCellData(j, i, date, State.PAST_MONTH_DAY, RecordState.Unkown);
} else if (position >= firstDayWeek + currentMonthDays) {
date = new CustomDate(mShowDate.year, mShowDate.month + 1, position - firstDayWeek - currentMonthDays + 1, i);
updateCellData(j, i, date, State.NEXT_MONTH_DAY, RecordState.Unkown);
}
}
}
}
@Override
public void update() {
fillMonthDate(false);
invalidate();
}
@Override
public void backToday() {
initDate();
invalidate();
}
@Override
public void update(CustomDate showDate, CustomDate clickDate) {
mShowDate = showDate;
mClickDate = clickDate;
mClickHideDate = clickDate;
fillMonthDate(false);
invalidate();
}
@Override
public CustomDate getClickDate() {
return mClickDate;
}
@Override
public RecordState getRecordDateState(CustomDate date) {
RecordState state = null;
if (mCallBack != null) {
state = mCallBack.setSignDateStatus(date);
}
return state != null ? state : RecordState.UnSign;
}
public void rightSlide() {
if (mShowDate.month == 12) {
mShowDate.month = 1;
mShowDate.year += 1;
} else {
mShowDate.month += 1;
}
fillDate();
invalidate();
}
public void leftSlide() {
if (mShowDate.month == 1) {
mShowDate.month = 12;
mShowDate.year -= 1;
} else {
mShowDate.month -= 1;
}
fillDate();
invalidate();
}
public void setOnCalenderListener(OnCalenderListener callBack) {
this.mCallBack = callBack;
}
@Override
public OnCalenderListener getOnCalenderListener() {
return mCallBack;
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarView.java
================================================
package com.palmwifi.testcal.calendar;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import com.palmwifi.testcal.R;
public abstract class CalendarView extends View {
public static final int TOTAL_COL = 7;
public static final int TOTAL_ROW = 6;
private Paint mCirclePaint;
private Paint mTextPaint;
private Paint mRectPaint;
private int mCellSpace;
private int mCellSpaceY;
public Row rows[] = new Row[TOTAL_ROW];
private int touchSlop;
private boolean callBackCellSpace;
public static CustomDate NowDate = new CustomDate();
private boolean isNeedShowClickDay = true;
private boolean isAutoClickFirstDay= true;
public CalendarView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CalendarView(Context context) {
super(context);
init(context);
}
public abstract void update();
public abstract void backToday();
public abstract void update(CustomDate showDate, CustomDate clickDate);
public abstract CustomDate getClickDate();
public abstract RecordState getRecordDateState(CustomDate date);
public abstract void rightSlide();
public abstract void leftSlide();
public abstract void setOnCalenderListener(OnCalenderListener callBack);
protected abstract void measureClickCell(int col, int row);
public abstract OnCalenderListener getOnCalenderListener();
protected abstract void initDate();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < TOTAL_ROW; i++) {
if (rows[i] != null) {
rows[i].drawCells(canvas);
}
}
}
private void init(Context context) {
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
mCellSpaceY = getResources().getDimensionPixelOffset(R.dimen.calendar_view_height);
mCirclePaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_sign_color));
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int mViewWidth = w;
mCellSpace = mViewWidth / TOTAL_COL;
if (!callBackCellSpace) {
if (getOnCalenderListener() != null)
getOnCalenderListener().onMeasureCellHeight(mCellSpaceY);
callBackCellSpace = true;
}
mTextPaint.setTextSize(mCellSpace / 3);
}
private float mDownX;
private float mDownY;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = event.getX();
mDownY = event.getY();
break;
case MotionEvent.ACTION_UP:
float disX = event.getX() - mDownX;
float disY = event.getY() - mDownY;
if (Math.abs(disX) < touchSlop && Math.abs(disY) < touchSlop) {
int col = (int) (mDownX / mCellSpace);
int row = (int) (mDownY / mCellSpaceY);
measureClickCell(col, row);
}
break;
}
return true;
}
class Row {
public int j;
Row(int j) {
this.j = j;
}
public Cell[] cells = new Cell[TOTAL_COL];
public void drawCells(Canvas canvas) {
for (int i = 0; i < cells.length; i++) {
if (cells[i] != null) {
Cell nextCell = null;
Cell perCell = null;
if(i+1 < cells.length){
nextCell = cells[i+1];
}
if(i -1 >= 0){
perCell = cells[i-1];
}
cells[i].drawSelf(canvas,perCell,nextCell);
}
}
}
}
class Cell {
public CustomDate date;
public State state;
public RecordState recordState;
public int i;
public int j;
public Cell(CustomDate date, State state, RecordState recordState, int i, int j) {
this.date = date;
this.state = state;
this.i = i;
this.j = j;
this.recordState = recordState;
}
public void update(CustomDate date, State state, RecordState recordState) {
this.date = date;
this.state = state;
this.recordState = recordState;
}
public void drawSelf(Canvas canvas,Cell perCell,Cell nextCell) {
if (state == State.NEXT_MONTH_DAY || state == State.PAST_MONTH_DAY) {
return;
}
boolean isSign = false;
mTextPaint.setColor(ContextCompat.getColor(getContext(), R.color.drak_calendar_text_color));
switch (recordState) {
case Sign:
mRectPaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_sign_color));
mTextPaint.setColor(Color.WHITE);
isSign = true;
mCirclePaint.setColor(mRectPaint.getColor());
break;
case Buckle:
mRectPaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_buckle_color));
mCirclePaint.setColor(mRectPaint.getColor());
mTextPaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_buckle_text_color));
break;
case UnSign:
mCirclePaint.setColor(ContextCompat.getColor(getContext(), R.color.cal_safe_color));
mRectPaint.setColor(Color.TRANSPARENT);
break;
case Unkown:
mCirclePaint.setColor(Color.TRANSPARENT);
mRectPaint.setColor(Color.TRANSPARENT);
break;
}
float x = (float) (mCellSpace * (i + 0.5));
float y = (float) ((j + 0.5) * mCellSpaceY);
String content = date.day + "";
int radius = mCellSpace / 2 - 20;
boolean isNeedRect = (isSign && i != 6 && nextCell != null && (nextCell.state == State.CURRENT_MONTH_DAY
||nextCell.state == State.CLICK_DAY ||nextCell.state == State.TODAY)
&& nextCell.recordState == RecordState.Sign);
if(isNeedRect){
canvas.drawRect(x,y-radius,x+mCellSpace,y+radius,mRectPaint);
}
switch (state) {
case CURRENT_MONTH_DAY:
canvas.drawCircle(x, y, radius, mRectPaint);
break;
case TODAY:
canvas.drawCircle(x, y, radius, mRectPaint);
if(isNeedShowClickDay) {
content = "今";
}
break;
case CLICK_DAY:
if(isNeedShowClickDay){
mTextPaint.setColor(ContextCompat.getColor(getContext(), R.color.base_black_title_color));
mCirclePaint.setStyle(Paint.Style.STROKE);
mCirclePaint.setStrokeWidth(4);
if (date.isSameDay(NowDate)) {
content = "今";
}
if(isSign){
mRectPaint.setColor(Color.WHITE);
canvas.drawCircle(x, y, radius, mRectPaint);
}
canvas.drawCircle(x, y, radius, mCirclePaint);
}else{
canvas.drawCircle(x, y, radius, mRectPaint);
}
break;
default:
canvas.drawCircle(x, y, radius, mRectPaint);
break;
}
canvas.drawText(content, x - mTextPaint.measureText(content) / 2, y + mTextPaint.measureText("1", 0, 1) * 2 / 3, mTextPaint);
}
}
protected void updateCellData(int row, int col, CustomDate date, State state, RecordState mState) {
if (rows[row].cells[col] != null) {
rows[row].cells[col].update(date, state, mState);
} else {
rows[row].cells[col] = new Cell(date, state, mState, col, row);
}
}
enum State {
CURRENT_MONTH_DAY, TODAY, CLICK_DAY, PAST_MONTH_DAY, NEXT_MONTH_DAY;
}
public boolean isAutoClickFirstDay() {
return isAutoClickFirstDay;
}
public void setAutoClickFirstDay(boolean autoClickFirstDay) {
isAutoClickFirstDay = autoClickFirstDay;
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewBuilder.java
================================================
package com.palmwifi.testcal.calendar;
import android.content.Context;
public class CalendarViewBuilder {
public static CalendarView[] createMonthCalendarViews(Context context,
int count, OnCalenderListener onCalenderListener) {
return createMonthCalendarViews(context,count,true,onCalenderListener);
}
public static CalendarView[] createMonthCalendarViews(Context context,
int count,boolean isAutoClickFirstDay, OnCalenderListener onCalenderListener) {
CalendarView[] calendarViews = new CalendarView[count];
for (int i = 0; i < count; i++) {
calendarViews[i] = new CalendarMonthView(context,onCalenderListener);
calendarViews[i].setAutoClickFirstDay(isAutoClickFirstDay);
}
return calendarViews;
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerAdapter.java
================================================
package com.palmwifi.testcal.calendar;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
public class CalendarViewPagerAdapter<V extends View> extends PagerAdapter {
private V[] views;
public CalendarViewPagerAdapter(V[] views) {
super();
this.views = views;
}
@Override
public void finishUpdate(View arg0) {
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object instantiateItem(View arg0, int arg1) {
View childView = views[arg1 % views.length];
if(childView.getParent() != null){
((ViewGroup)childView.getParent()).removeView(childView);
}
((ViewPager) arg0).addView(childView, 0);
return childView;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
// TODO Auto-generated method stub
}
@Override
public void startUpdate(View arg0) {
}
public V[] getAllItems() {
return views;
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerListener.java
================================================
package com.palmwifi.testcal.calendar;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
public class CalendarViewPagerListener implements OnPageChangeListener {
private SlideDirection mDirection = SlideDirection.NO_SILDE;
int mCurrIndex = 498;
private CalendarView[] mShowViews;
private ViewPager mPager;
private boolean isAutoClickFristDay = true;
public CalendarViewPagerListener(ViewPager viewPager, CalendarViewPagerAdapter<CalendarView> viewAdapter) {
this.mShowViews = viewAdapter.getAllItems();
this.mPager = viewPager;
}
@Override
public void onPageSelected(int arg0) {
measureDirection(arg0);
updateCalendarView(arg0);
}
private void updateCalendarView(int arg0) {
CalendarView calendar = mShowViews[arg0 % mShowViews.length];
if(mDirection == SlideDirection.RIGHT){
calendar.rightSlide();
}else if(mDirection == SlideDirection.LEFT){
calendar.leftSlide();
}
mDirection = SlideDirection.NO_SILDE;
}
private void measureDirection(int arg0) {
if (arg0 > mCurrIndex) {
mDirection = SlideDirection.RIGHT;
} else if (arg0 < mCurrIndex) {
mDirection = SlideDirection.LEFT;
}
mCurrIndex = arg0;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
public CalendarView getCurrentCalendar(){
return mShowViews[mPager.getCurrentItem() % mShowViews.length];
}
public void updateCalendar(){
CalendarView calendar = mShowViews[mPager.getCurrentItem() % mShowViews.length];
calendar.update();
}
public void backToday(){
CalendarView calendar = mShowViews[mPager.getCurrentItem() % mShowViews.length];
calendar.backToday();
}
enum SlideDirection {
RIGHT, LEFT, NO_SILDE;
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CustomDate.java
================================================
package com.palmwifi.testcal.calendar;
import java.io.Serializable;
public class CustomDate implements Serializable,Comparable<CustomDate>{
private static final long serialVersionUID = 1L;
public int year;
public int month;
public int day;
public int week;
public CustomDate(int year,int month,int day,int week){
if(month > 12){
month = 1;
year++;
}else if(month <1){
month = 12;
year--;
}
this.year = year;
this.month = month;
this.day = day;
this.week = week;
}
public CustomDate(int year,int month,int day){
if(month > 12){
month = 1;
year++;
}else if(month <1){
month = 12;
year--;
}
this.year = year;
this.month = month;
this.day = day;
}
public CustomDate(){
this.year = DateUtil.getYear();
this.month = DateUtil.getMonth();
this.day = DateUtil.getCurrentMonthDay();
this.week = DateUtil.getWeekDay();
}
public static CustomDate modifiDayForObject(CustomDate date,int day,int week){
CustomDate modifiDate = new CustomDate(date.year,date.month,day,week);
return modifiDate;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public boolean isSameDay(CustomDate customDate){
return year == customDate.year&& customDate.month == month && day == customDate.day;
}
public int getWeek() {
return week;
}
public void setWeek(int week) {
this.week = week;
}
@Override
public String toString() {
return year+"-"+month+"-"+day;
}
@Override
public int compareTo(CustomDate another) {
if(another != null){
if(this.year >another.year){
return 1;
}else if(this.year == another.year && this.month > another.month){
return 1;
}else if(this.year == another.year && this.month == another.month && this.day >another.day){
return 1;
}else if(this.year == another.year && this.month == another.month && this.day == another.day){
return 0;
}
return -1;
}
return -1;
}
public int compareDays(CustomDate another){
if(this.month == another.month){
return this.day - another.day;
}else{
int days = DateUtil.getMonthDays(another.year,another.month);
return days - another.day + this.day;
}
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/DateUtil.java
================================================
package com.palmwifi.testcal.calendar;
import android.annotation.SuppressLint;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtil {
public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
public static int getMonthDays(int year, int month) {
if (month > 12) {
month = 1;
year += 1;
} else if (month < 1) {
month = 12;
year -= 1;
}
int[] arr = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int days = 0;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
arr[1] = 29;
}
try {
days = arr[month - 1];
} catch (Exception e) {
e.getStackTrace();
}
return days;
}
public static int getYear() {
return Calendar.getInstance().get(Calendar.YEAR);
}
public static int getMonth() {
return Calendar.getInstance().get(Calendar.MONTH) + 1;
}
public static int getCurrentMonthDay() {
return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
}
public static int getWeekDay() {
return Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
}
public static int getHour() {
return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
}
public static int getMinute() {
return Calendar.getInstance().get(Calendar.MINUTE);
}
public static int getWeekDayFromDate(int year, int month) {
Calendar cal = Calendar.getInstance();
cal.setTime(getDateFromString(year, month));
int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (week_index < 0) {
week_index = 0;
}
return week_index;
}
@SuppressLint("SimpleDateFormat")
public static Date getDateFromString(int year, int month) {
String dateString = year + "-" + (month > 9 ? month : ("0" + month))
+ "-01";
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(dateString);
} catch (ParseException e) {
System.out.println(e.getMessage());
}
return date;
}
public static boolean isToday(CustomDate date){
return(date.year == DateUtil.getYear() &&
date.month == DateUtil.getMonth()
&& date.day == DateUtil.getCurrentMonthDay());
}
public static boolean isCurrentMonth(CustomDate date){
return(date.year == DateUtil.getYear() &&
date.month == DateUtil.getMonth());
}
public static int betweenDays(CustomDate date, CustomDate compareDate){
int dayCount = 0;
try {
Date date1 = simpleDateFormat.parse(date.year+(date.month<10?"0"+date.month :""+date.month)+""+(date.day<10?"0"+date.day:""+date.day));
Date compareDate1 = simpleDateFormat.parse(compareDate.year+(compareDate.month<10?"0"+compareDate.month :""+compareDate.month)+""+(compareDate.day<10?"0"+compareDate.day:""+compareDate.day));
dayCount = (int) ((date1.getTime()-compareDate1.getTime())/(3600000*24));
} catch (ParseException e) {
e.printStackTrace();
}
return dayCount;
}
public static class State{
public String tip;
public int day;
public State(String tip, int day) {
this.tip = tip;
this.day = day;
}
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/OnCalenderListener.java
================================================
package com.palmwifi.testcal.calendar;
public interface OnCalenderListener {
void clickDate(CustomDate date);
void showDate(CustomDate date);
void onMeasureCellHeight(int cellSpace);
void changeRowCount(int rows);
RecordState setSignDateStatus(CustomDate date);
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/calendar/RecordState.java
================================================
package com.palmwifi.testcal.calendar;
/**
* Created by David on 2017/4/12.
*/
public enum RecordState {
//签到的
Sign,
//未签到
UnSign,
//扣除
Buckle,
//未知
Unkown;
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/dash/DashboardView.java
================================================
package com.palmwifi.testcal.dash;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;
import com.palmwifi.testcal.R;
import java.text.DecimalFormat;
/**
* Created by David on 2016/11/10.
*/
public class DashboardView extends View {
public static final int MAX_AMIN_TIME = 400;
public static final int BORDER = 42;
public static final int CENTER_CIRCLE_RADIUS = 35;
public static final int TOTAL_ANGLE = 330;
public static final int GRADUATED_LINE_PADDING = 0; //刻度线
public static final int SCALE_VALUE_PADDING = 7; //刻度线
public static final int SCALE_INV = 10; //每隔间距10画一个值 默认
public static final int GRADUATED_INV = 2;//每隔间距2画一个刻度线 默认
public static final float LINE_PERCENT = 0.6f;
private Paint mArcPaint;
private Paint mInvPaint;
private Paint mTextPaint;
private Paint mLinePaint;
private int mTextHeight;
private Paint mIntervalsPaint;
private Paint mNumberPaint;
private Paint mCenterCirclePaint;
private int totalAngle = TOTAL_ANGLE;
private int[] intervals = {35, 10, 35};
private String[] intervalStr;
private int angle = 0;
private int startNum = 0;
private int[] colorRes = {R.color.arc1, R.color.arc2, R.color.arc3};
private int centerCircleRadius = CENTER_CIRCLE_RADIUS;
private int circleBorder = BORDER;
private int graduatedLineinv = GRADUATED_LINE_PADDING; //指针和线之间的间距
private int scaleValueinv = SCALE_VALUE_PADDING; //数字和指针的间距
private int graduatedLineLength = SCALE_VALUE_PADDING;//线的长度
private int tempAngle = 0;
private String unit = "℃";
private int animAngle = 5;
private int scaleValInv = SCALE_INV;
private int graduatedInv = GRADUATED_INV;
private float linePercent = LINE_PERCENT;
private float angleTextSize;
private float numberTextSize;
private float graduatedTextSize;
private int[] filterNumbers;
private String drawNumText;
public static DecimalFormat df = new DecimalFormat("#.0");
private Path path;
private RectF oval;
public DashboardView(Context context) {
super(context);
initView();
}
public DashboardView(Context context, AttributeSet attrs) {
super(context, attrs);
initAttr(attrs);
initView();
}
public DashboardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initAttr(attrs);
initView();
}
private void initAttr(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.DashboardView);
totalAngle = a.getInteger(R.styleable.DashboardView_totalAngle, TOTAL_ANGLE);
centerCircleRadius = a.getDimensionPixelSize(R.styleable.DashboardView_centerCircleRadius, CENTER_CIRCLE_RADIUS);
circleBorder = a.getDimensionPixelSize(R.styleable.DashboardView_arcBorderDimen, BORDER);
angleTextSize = a.getDimension(R.styleable.DashboardView_angleTextSize, 25);
numberTextSize = a.getDimension(R.styleable.DashboardView_numberTextSize, 25);
graduatedTextSize = a.getDimension(R.styleable.DashboardView_graduatedTextSize, 25);
linePercent = a.getFloat(R.styleable.DashboardView_pointLinePercent, 0.6f);
a.recycle();
}
/* @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = measure(widthMeasureSpec);
int height = measure(heightMeasureSpec);
int d = Math.min(width, height);
setMeasuredDimension(d, d);
}
protected int measure(int measureSpec) {
int size;
int measureMode = MeasureSpec.getMode(measureSpec);
if (measureMode == MeasureSpec.UNSPECIFIED) {
size = 250;
} else {
size = MeasureSpec.getSize(measureSpec);
}
return size;
}*/
protected void initView() {
mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mArcPaint.setAntiAlias(true);
mArcPaint.setStrokeWidth(circleBorder);
mArcPaint.setStyle(Style.STROKE);
mArcPaint.setStrokeCap(Paint.Cap.ROUND);
mInvPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mInvPaint.setAntiAlias(true);
mInvPaint.setStrokeWidth(circleBorder + 1);
mInvPaint.setColor(Color.WHITE);
mInvPaint.setStyle(Style.STROKE);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(getResources().getColor(R.color.arc_text));
mTextPaint.setTextSize(numberTextSize);
mTextPaint.setTypeface(Typeface.DEFAULT);
mIntervalsPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mIntervalsPaint.setColor(Color.WHITE);
mIntervalsPaint.setTextSize(graduatedTextSize);
mIntervalsPaint.setTypeface(Typeface.DEFAULT);
mNumberPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mNumberPaint.setColor(getResources().getColor(R.color.arc_temp));
mNumberPaint.setTextSize(angleTextSize);
mNumberPaint.setTypeface(Typeface.DEFAULT);
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setStrokeWidth(3f);
mLinePaint.setStyle(Style.FILL);
mLinePaint.setColor(getResources().getColor(R.color.arc_line));
mCenterCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCenterCirclePaint.setAntiAlias(true);
mCenterCirclePaint.setStrokeWidth(4f);
mCenterCirclePaint.setColor(getResources().getColor(R.color.arc_line));
mCenterCirclePaint.setStyle(Style.STROKE);
path = new Path();
mTextHeight = (int) mLinePaint.measureText("NN");
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int px = getMeasuredWidth() / 2;
int py = getMeasuredHeight() / 2;
int maxRadius = Math.min(px, py);
py = maxRadius;
int x = maxRadius / 10;
int realRadius = maxRadius - x;
if(oval == null) {
oval= new RectF(x + (px - py), maxRadius / 10, maxRadius * 2 - x + (px - py), maxRadius * 2 - x);
}
if (px > py) {
px = (px - py) + maxRadius;
}
float totalScores = 0f;
for (int s : intervals) {
totalScores += s;
}
float perAngle = totalAngle / totalScores;
int startAngle = (360 - totalAngle) / 2 + 90;
for (int i = 0; i < intervals.length; i++) {
mArcPaint.setColor(ContextCompat.getColor(getContext(),i < colorRes.length ? colorRes[i] : colorRes[0]));
int sweepAngle = (int) (perAngle * intervals[i]);
canvas.drawArc(oval, startAngle, sweepAngle, false, mArcPaint);
startAngle += sweepAngle;
mArcPaint.setColor(Color.WHITE);
if (i != 0) {
canvas.drawArc(oval, startAngle - sweepAngle - 5, 5, false, mInvPaint);
}
}
canvas.drawCircle(px, py, centerCircleRadius, mCenterCirclePaint);
String text = (drawNumText != null ? drawNumText : angle) + unit;
canvas.drawText(text, px - (text.length() > 3 ?mTextHeight*3 :mTextHeight), 2 * maxRadius - mTextHeight + 6, mNumberPaint);
canvas.save();
canvas.rotate(-totalAngle / 2, px, py);
int invPos = 0;
int inv = startNum;
int graduatedLineY = py - realRadius + circleBorder - graduatedLineLength;
for (int i = startNum; i <= totalScores + startNum; i++) {
canvas.save();
if (i % scaleValInv == 0) {
boolean isDraw = true;
if (filterNumbers != null) {
ok:
for (int n : filterNumbers) {
if (n == i) {
isDraw = false;
break ok;
}
}
}
if (isDraw) {
canvas.drawText(i + "", px - mTextHeight + 6, graduatedLineY + scaleValueinv + graduatedLineLength + graduatedLineinv +
mTextHeight, mTextPaint);//方位
}
}
if (i % graduatedInv == 0) {
canvas.drawLine(px, graduatedLineY, px, graduatedLineY + graduatedLineLength, mLinePaint);
}
if (i == angle) {
canvas.drawLine(px, py - centerCircleRadius, px, (int) (py - maxRadius * linePercent), mCenterCirclePaint);
}
if (intervalStr != null && invPos < intervals.length) {
if (i - 1 == inv + intervals[invPos] / 2) {
path.reset();
path.addArc(oval,-90- (intervalStr[invPos].length() >5 ? 20:10),180);
boolean isReduce = false;
if(intervalStr[invPos].length() >5 ){
mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() -5);
isReduce = true;
}
canvas.drawTextOnPath(intervalStr[invPos], path, 0, circleBorder / 2 - mTextHeight / 2 + 6, mIntervalsPaint);
if(isReduce){
mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() +5);
}
inv += intervals[invPos];
invPos++;
}
}
canvas.restore();
canvas.rotate(perAngle, px, py);
}
canvas.restore();
}
public int getAngle() {
return angle;
}
public void setAngle(int angle) {
this.angle = angle;
invalidate();
}
public void setAngleWithAnim(int angle) {
if (angle == startNum) {
this.angle = angle;
invalidate();
return;
}
tempAngle = angle;
animAngle = 5;
post(animAngleRunnable);
}
public void setAngleWithAnim(double angle) {
drawNumText = df.format(angle);
setAngleWithAnim((int)angle);
}
private Runnable animAngleRunnable = new Runnable() {
@Override
public void run() {
if (tempAngle > angle) {
angle += animAngle;
if (angle > tempAngle) {
angle = tempAngle;
tempAngle = 0;
}
}
invalidate();
postDelayed(this, 50);
}
};
/**
* 初始化
*
* @param startNum 开始的值
* @param eachInterval 每个区 间隔
*/
public void initDash(int startNum, int[] eachInterval, String[] intervalStrs) {
initDash(startNum, eachInterval, intervalStrs, null, null);
}
public void initDash(int startNum, int[] eachInterval, String[] intervalStrs, String unit, int[] colors) {
initDash(startNum, eachInterval, intervalStrs, unit, colors, null);
}
/**
* 初始化
*
* @param startNum 开始的值
* @param eachInterval 每个区 间隔
* @param colors 区间 颜色值
*/
public void initDash(int startNum, int[] eachInterval, String[] intervalStrs, String unit, int[] colors, int[] filterNumbers) {
this.startNum = startNum;
intervals = eachInterval;
if (colorRes != null) {
this.colorRes = colors;
}
this.intervalStr = intervalStrs;
if (unit != null) {
this.unit = unit;
}
if (filterNumbers != null) {
this.filterNumbers = filterNumbers;
}
invalidate();
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/dash/RingView.java
================================================
package com.palmwifi.testcal.dash;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.RadialGradient;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.animation.DecelerateInterpolator;
import com.palmwifi.testcal.R;
/**
* Created by David on 2016/11/10.
*/
public class RingView extends View {
public static final int BORDER = 42;
public static final int TOTAL_ANGLE = 360;
private Paint mArcPaint;
private int mTextHeight;
private Paint mIntervalsPaint;
private Paint mCenterCirclePaint;
private int totalAngle = TOTAL_ANGLE;
private int totalSection = 3;
private String[] TextStrArray;
private int[] colorRes;
private int defaultColor;
private int bgColor;
private int selectTextColor;
private int unSelectTextColor;
private int circleBorder = BORDER;
private Point centerPoint;
private int centerRadius;
private float centerTextSize;
private int selectPosition;
private RectF oval;
private RectF oval2;
private int touchSlop;
private Path path;
private int tempTotalAngle;
private int animTime = 20;
private Paint mShadowPaint;
private boolean isAnim;
private OnDashItemClickListener itemClickListener;
public RingView(Context context) {
super(context);
initView();
}
public RingView(Context context, AttributeSet attrs) {
super(context, attrs);
initAttr(attrs);
initView();
}
public RingView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initAttr(attrs);
initView();
}
private void initAttr(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.RingView);
defaultColor = a.getColor(R.styleable.RingView_arc_select_color, ContextCompat.getColor(getContext(), R.color.selectColor));
selectTextColor = a.getColor(R.styleable.RingView_arcSelectTextColor, Color.WHITE);
bgColor = a.getColor(R.styleable.RingView_arc_bg_color, ContextCompat.getColor(getContext(), R.color.arc_bg));
unSelectTextColor = a.getColor(R.styleable.RingView_arcTextColor, ContextCompat.getColor(getContext(), R.color.arc_text));
circleBorder = a.getDimensionPixelSize(R.styleable.RingView_arcBorder, BORDER);
centerTextSize = a.getDimension(R.styleable.RingView_arcTextSize, 25);
touchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
a.recycle();
}
protected void initView() {
mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mArcPaint.setAntiAlias(true);
mArcPaint.setStrokeWidth(circleBorder);
mArcPaint.setStyle(Style.STROKE);
mArcPaint.setStrokeCap(Paint.Cap.BUTT);
mIntervalsPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mIntervalsPaint.setColor(Color.BLACK);
mIntervalsPaint.setTextSize(centerTextSize);
mIntervalsPaint.setTypeface(Typeface.DEFAULT);
mCenterCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCenterCirclePaint.setAntiAlias(true);
mCenterCirclePaint.setColor(bgColor);
mCenterCirclePaint.setStyle(Style.STROKE);
mTextHeight = (int) mIntervalsPaint.measureText("NN");
mShadowPaint= new Paint(Paint.ANTI_ALIAS_FLAG); //初始化画笔,为后面阴影效果使用。
//mShadowPaint.setStyle(Style.STROKE);
// mShadowPaint.setStrokeWidth(5);
//mShadowPaint.setShadowLayer(10f, 5.0f, 5.0f, Color.parseColor("#f2f2f2")); //设置阴影层,这是关键。
path = new Path();
}
private float mDownX;
private float mDownY;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = event.getX();
mDownY = event.getY();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_MOVE:
/* int disX = (int) (event.getX() - mDownX);
int disY = (int) (event.getY() - mDownY);
if (Math.abs(disX) < touchSlop && Math.abs(disY) < touchSlop) {*/
int clickX = (int) event.getX();
int clickY = (int) event.getY();
int x = clickX - centerPoint.x;
int y = clickY - centerPoint.y;
int z = (int) Math.sqrt(Math.pow(Math.abs(x), 2) + Math.pow(Math.abs(y), 2));
if (z >= centerRadius - circleBorder / 2 && z <= centerRadius + circleBorder + 20) {
double angle = Math.abs(Math.toDegrees(Math.atan((event.getY() - centerPoint.y) / (event.getX() - centerPoint.x))));
if (x >= 0 && y < 0) {
angle = 90 - angle;
} else if (x >= 0 && y >= 0) {
angle = 90 + angle;
} else if (x < 0 && y >= 0) {
angle = 270 - angle;
} else {
angle = 270 + angle;
}
int selectPosition = (int) (angle / (totalAngle / totalSection));
setSelectPosition(selectPosition);
}
/*}*/
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float perAngle = totalAngle / totalSection;
float startAngle = -90;
if (centerPoint == null) {
int px = getMeasuredWidth() / 2;
int py = getMeasuredHeight() / 2;
int maxRadius = Math.min(px, py);
py = maxRadius;
int margin = maxRadius / 5;
if (px > py) {
px = (px - py) + maxRadius;
}
centerPoint = new Point(px, py);
oval = new RectF(margin + (px - py), margin, maxRadius * 2 - margin + (px - py), maxRadius * 2 - margin);
oval2 = new RectF(oval.left-circleBorder, oval.top -circleBorder,oval.right+circleBorder, oval.bottom+circleBorder);
centerRadius = maxRadius - margin;
float innerRadius = (centerRadius-circleBorder/2)/((float)(centerRadius + circleBorder));
float outRadius = (centerRadius+circleBorder/2)/((float)(centerRadius + circleBorder));
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);
mShadowPaint.setShader(gradient);
}
mCenterCirclePaint.setStrokeWidth(circleBorder);
if(!isAnim) {
canvas.drawArc(oval2, startAngle + perAngle * selectPosition, totalAngle, false, mShadowPaint);
}
canvas.drawArc(oval, startAngle +perAngle*selectPosition, totalAngle, false, mCenterCirclePaint);
for (int i = 0; i < totalSection; i++) {
if (i == selectPosition) {
int selectColor = (colorRes == null ? defaultColor : ContextCompat.getColor(getContext(), colorRes[i]));
mArcPaint.setColor(selectColor);
canvas.drawArc(oval, startAngle, perAngle, false, mArcPaint);
}else {
mArcPaint.setColor(ContextCompat.getColor(getContext(),R.color.arc_inteval));
canvas.drawArc(oval, startAngle, 0.5f, false, mArcPaint);
}
path.reset();
path.addArc(oval, startAngle+perAngle/2, perAngle);
mIntervalsPaint.setColor(i == selectPosition ? selectTextColor : unSelectTextColor);
if (TextStrArray != null) {
boolean isReduce = false;
if (TextStrArray[i].length() > 5) {
mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() - 5);
isReduce = true;
}
if (isReduce) {
mIntervalsPaint.setTextSize(mIntervalsPaint.getTextSize() + 5);
}
canvas.drawTextOnPath(TextStrArray[i], path, 0, circleBorder / 2 - mTextHeight / 2 + 6, mIntervalsPaint);
} else {
canvas.drawTextOnPath((i + 1) + "", path, 0, circleBorder / 2 - mTextHeight / 2, mIntervalsPaint);
}
startAngle += perAngle;
}
}
public void initDash(String[] intervalStrs, int[] colors) {
this.TextStrArray = intervalStrs;
this.colorRes = colors;
}
public void startAnim(final int anim) {
tempTotalAngle = totalAngle;
totalAngle =1;
isAnim = true;
ValueAnimator valueAnimator = ValueAnimator.ofInt(0,tempTotalAngle);
valueAnimator.setDuration(anim);
valueAnimator.setInterpolator(new DecelerateInterpolator());//减速差值器
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
totalAngle = (int) animation.getAnimatedValue();
if(totalAngle <1){
totalAngle =1;
}
if(tempTotalAngle == totalAngle){
isAnim = false;
}
invalidate();
}
});
valueAnimator.start();
}
public void start(final int anim) {
ValueAnimator valueAnimator = ValueAnimator.ofInt(0,totalSection);
valueAnimator.setDuration(anim);
valueAnimator.setRepeatCount(100);
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
//valueAnimator.setInterpolator(new DecelerateInterpolator());//减速差值器
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
selectPosition = (int) animation.getAnimatedValue();
invalidate();
}
});
valueAnimator.start();
}
public void setOnDashItemClickListener(OnDashItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
public void setSelectPosition(int selectPosition) {
if (this.selectPosition != selectPosition) {
this.selectPosition = selectPosition;
if (itemClickListener != null) {
itemClickListener.onItemClick(this, selectPosition);
}
invalidate();
}
}
public void setTotalSection(int totalSection) {
this.totalSection = totalSection;
}
public interface OnDashItemClickListener {
void onItemClick(RingView dashView, int position);
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/newcalendar/CustomCalendarAdapter.java
================================================
package com.palmwifi.testcal.newcalendar;
import com.bin.david.calendar.CalendarAdapter;
import com.bin.david.calendar.CalendarView;
/**
* Created by huang on 2017/11/22.
*/
public class CustomCalendarAdapter extends CalendarAdapter {
private CustomTextDrawFormat format;
public CustomCalendarAdapter(int mode) {
super(mode);
}
public CustomCalendarAdapter() {
}
@Override
protected void decorateCalendarView(CalendarView calendarView) {
if(format == null){
format = new CustomTextDrawFormat(mContext);
}
calendarView.addDrawFormat(format);
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/newcalendar/CustomTextDrawFormat.java
================================================
package com.palmwifi.testcal.newcalendar;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.v4.content.ContextCompat;
import com.bin.david.calendar.CalendarView;
import com.bin.david.calendar.CustomDate;
import com.bin.david.calendar.DateUtil;
import com.bin.david.calendar.TextDrawFormat;
import com.palmwifi.testcal.R;
import com.palmwifi.testcal.utils.DensityUtils;
/**
* Created by huang on 2017/11/22.
*/
public class CustomTextDrawFormat extends TextDrawFormat {
public static final int TODAY =1;
public static final int CURRENT_MONTH_DAY = 2;
public static final int OTHER_MONTH_DAY = 4;
public static final int CLICK_DAY = 3;
private int progress = 100;
private CalendarView calendarView;
private Context mContext;
public CustomTextDrawFormat(Context context) {
this.mContext = context;
setDrawLunar(true);
setInterval(DensityUtils.dp2px(context,7));
}
private CustomDate clickDate;
@Override
public void onDrawBackground(Canvas canvas, int type, Rect rect, Paint paint) {
if(type == CLICK_DAY) {
paint.setStyle(Paint.Style.FILL);
paint.setColor(ContextCompat.getColor(mContext, R.color.selectColor));
int r = Math.min(rect.width(), rect.height()) / 2 *progress/100;
canvas.drawCircle(rect.centerX(), rect.centerY(), r, paint);
}
}
@Override
public void onDrawBefore(Canvas canvas, int type, Rect rect, Paint paint) {
if(type == CLICK_DAY){
paint.setColor(ContextCompat.getColor(mContext,android.R.color.white));
}else if(type == OTHER_MONTH_DAY){
paint.setColor(ContextCompat.getColor(mContext, R.color.cal_buckle_text_color));
}
}
@Override
public void onDrawLunarBefore(Canvas canvas, int type, Rect rect,int dayLevel,Paint paint) {
paint.setTextSize(DensityUtils.sp2px(mContext, 9));
if(type == CLICK_DAY) {
paint.setColor(ContextCompat.getColor(mContext,android.R.color.white));
}else{
if(dayLevel == TextDrawFormat.FESTIVAL){
paint.setColor(ContextCompat.getColor(mContext, R.color.arc1));
}else if(dayLevel == TextDrawFormat.SOLAR){
paint.setColor(ContextCompat.getColor(mContext, R.color.arc22));
}else {
paint.setColor(ContextCompat.getColor(mContext, R.color.arc_text));
}
}
}
@Override
public boolean isDraw(int type) {
return true;
}
@Override
public int getDateType(CalendarView calendarView, CalendarView.Cell cell) {
CustomDate showDate = calendarView.getShowDate();
CustomDate compareDate = cell.getDate();
if(clickDate != null && compareDate.isSameDay(clickDate)){
return CLICK_DAY;
}
if(showDate.isSameMonth(compareDate)){
return CURRENT_MONTH_DAY;
}
if(DateUtil.isToday(compareDate)){
return TODAY;
}
return OTHER_MONTH_DAY;
}
@Override
public String getContent(CalendarView.Cell cell, int type) {
if(type == TODAY){
return "今";
}
return super.getContent(cell, type);
}
@Override
public void onDraw(final CalendarView calendarView) {
if(this.calendarView == calendarView && progress == 0){
ValueAnimator animator = ValueAnimator.ofInt(30,100).setDuration(200);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
progress = (int) animation.getAnimatedValue();
calendarView.invalidate();
}
});
animator.start();
}
}
@Override
public void onClick(CalendarView calendarView, CalendarView.Cell cell) {
super.onClick(calendarView, cell);
this.calendarView = calendarView;
progress = 0;
clickDate = cell.getDate();
}
}
================================================
FILE: app/src/main/java/com/palmwifi/testcal/utils/DensityUtils.java
================================================
package com.palmwifi.testcal.utils;
import android.content.Context;
import android.util.TypedValue;
//常用单位转换的辅助类
public class DensityUtils {
private DensityUtils() {
/* cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* dp转px
*
* @param context
* @return
*/
public static int dp2px(Context context, float dpVal)
{
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
dpVal, context.getResources().getDisplayMetrics());
}
/**
* sp转px
*
* @param context
* @return
*/
public static int sp2px(Context context, float spVal)
{
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
spVal, context.getResources().getDisplayMetrics());
}
/**
* px转dp
*
* @param context
* @param pxVal
* @return
*/
public static float px2dp(Context context, float pxVal)
{
final float scale = context.getResources().getDisplayMetrics().density;
return (pxVal / scale);
}
/**
* px转sp
*
* @param pxVal
* @return
*/
public static float px2sp(Context context, float pxVal)
{
return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
}
}
================================================
FILE: app/src/main/res/layout/ac_dash_broad.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.palmwifi.testcal.dash.DashboardView
android:id="@+id/temp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_margin="30dp"
android:layout_weight="1"
app:angleTextSize="14sp"
app:arcBorderDimen="10dp"
app:centerCircleRadius="5dp"
app:graduatedTextSize="9sp"
app:numberTextSize="8sp"
app:pointLinePercent="0.6"
app:totalAngle="300" />
<com.palmwifi.testcal.dash.DashboardView
android:id="@+id/humi"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_margin="30dp"
android:layout_weight="1"
app:angleTextSize="14sp"
app:arcBorderDimen="12dp"
app:centerCircleRadius="10dp"
app:graduatedTextSize="9sp"
app:numberTextSize="8sp"
app:pointLinePercent="0.6"
app:totalAngle="300" />
</LinearLayout>
================================================
FILE: app/src/main/res/layout/ac_home.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent">
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_new_month_cal"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="RecyclerView日历 月模式"
/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_new_week_cal"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="RecyclerView日历 星期模式"
/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_cal"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="日历"
/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_dash_board"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="仪表盘"
/>
<android.support.v7.widget.AppCompatButton
android:id="@+id/btn_round_board"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="圆盘"
/>
</LinearLayout>
================================================
FILE: app/src/main/res/layout/ac_ring.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.palmwifi.testcal.dash.RingView
android:id="@+id/humi"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:layout_weight="1"
app:arcBorder="30dp"
app:arcTextSize="14sp"/>
<com.palmwifi.testcal.dash.RingView
android:id="@+id/humi2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:layout_weight="1"
app:arcBorder="30dp"
app:arcTextSize="14sp"/>
</LinearLayout>
================================================
FILE: app/src/main/res/layout/activity_calendar.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f0f0f0"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="15dp"
android:layout_marginLeft="5dp"
android:layout_marginBottom="5dp"
android:layout_marginTop="15dp"
android:paddingTop="15dp"
android:background="@drawable/cal_sign_bg"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_cal_left"
android:layout_width="25dp"
android:layout_height="25dp"
android:scaleType="centerInside"
android:layout_alignParentLeft="true"
android:layout_marginLeft="18dp"
android:background="?attr/selectableItemBackgroundBorderless"
/>
<TextView
android:id="@+id/tv_show_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@color/base_black_title_color"
android:layout_gravity="center_horizontal"
android:textSize="14sp"/>
<ImageView
android:id="@+id/img_cal_right"
android:layout_width="25dp"
android:layout_height="25dp"
android:scaleType="centerInside"
android:layout_alignParentRight="true"
android:layout_marginRight="18dp"
android:background="?attr/selectableItemBackgroundBorderless"
/>
</RelativeLayout>
<TableLayout
android:id="@+id/tl_time"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<TableRow>
<TextView
style="@style/dateStyle"
android:text="日" />
<TextView
style="@style/dateStyle"
android:text="一" />
<TextView
style="@style/dateStyle"
android:text="二" />
<TextView
style="@style/dateStyle"
android:text="三" />
<TextView
style="@style/dateStyle"
android:text="四" />
<TextView
style="@style/dateStyle"
android:text="五" />
<TextView
style="@style/dateStyle"
android:text="六" />
</TableRow>
</TableLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.7dp"
android:layout_marginTop="7dp"
android:layout_marginBottom="2dp"
android:background="#d4d4d4"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f0f0f0"
android:orientation="vertical"
tools:context="com.palmwifi.testcal.CalendarActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="40dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:layout_marginLeft="15dp"
android:layout_marginBottom="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="12dp"
android:paddingTop="15dp"
android:background="@drawable/cal_sign_bg"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_cal_left"
android:layout_width="25dp"
android:layout_height="25dp"
android:scaleType="centerInside"
android:layout_alignParentLeft="true"
android:layout_marginLeft="18dp"
android:src="@mipmap/cal_sign_left"
android:background="?attr/selectableItemBackgroundBorderless"
/>
<TextView
android:id="@+id/tv_show_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@color/base_black_title_color"
android:layout_gravity="center_horizontal"
android:textSize="14sp"
android:text="2017年4月" />
<ImageView
android:id="@+id/img_cal_right"
android:layout_width="25dp"
android:layout_height="25dp"
android:scaleType="centerInside"
android:layout_alignParentRight="true"
android:layout_marginRight="18dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@mipmap/ca_sign_right"
/>
</RelativeLayout>
<TableLayout
android:id="@+id/tl_time"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<TableRow>
<TextView
style="@style/dateStyle"
android:text="日" />
<TextView
style="@style/dateStyle"
android:text="一" />
<TextView
style="@style/dateStyle"
android:text="二" />
<TextView
style="@style/dateStyle"
android:text="三" />
<TextView
style="@style/dateStyle"
android:text="四" />
<TextView
style="@style/dateStyle"
android:text="五" />
<TextView
style="@style/dateStyle"
android:text="六" />
</TableRow>
</TableLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.7dp"
android:layout_marginTop="7dp"
android:layout_marginBottom="2dp"
android:background="#d4d4d4"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
</RelativeLayout>
================================================
FILE: app/src/main/res/values/attrs.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="RingView">
<attr name="totalSection" format="integer"/>
<attr name="arcBorder" format="dimension"/>
<attr name="arcTextSize" format="dimension"/>
<attr name="arcSelectTextColor" format="color"/>
<attr name="arcTextColor" format="color"/>
<attr name="arc_bg_color" format="color"/>
<attr name="arc_select_color" format="color"/>
</declare-styleable>
<declare-styleable name="DashboardView">
<attr name="totalAngle" format="integer" />
<attr name="centerCircleRadius" format="dimension" />
<attr name="arcBorderDimen" format="dimension" />
<attr name="numberTextSize" format="dimension" />
<attr name="graduatedTextSize" format="dimension" />
<attr name="angleTextSize" format="dimension" />
<attr name="pointLinePercent" format="float" />
</declare-styleable>
</resources>
================================================
FILE: app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="cal_sign_color">#ee5b4f</color>
<color name="cal_buckle_color">#d4d4d4</color>
<color name="cal_safe_color">#b7d961</color>
<color name="cal_buckle_text_color">#949494</color>
<color name="drak_calendar_text_color">#222222</color>
<color name="base_black_title_color">#222222</color>
<color name="arc1">#099bfb</color>
<color name="arc2">#37d547</color>
<color name="arc3">#f86669</color>
<color name="arc_text">#999999</color>
<color name="arc_line">#cfcfcf</color>
<color name="selectColor">#f96767</color>
<color name="arc_bg">#f0f0f0</color>
<color name="arc_inteval">#E8e8e8</color>
<color name="arc_temp">#333333</color>
<color name="arc21">#fc843b</color>
<color name="arc22">#37d547</color>
<color name="arc23">#079df9</color>
</resources>
================================================
FILE: app/src/main/res/values/dimens.xml
================================================
<resources>
<!-- calendar -->
<dimen name="bar_margin">15dp</dimen>
<dimen name="calendar_day_margin_top">13dp</dimen>
<dimen name="calendar_per_view_height">24dp</dimen>
<dimen name="calendar_tip_height">27dp</dimen>
<dimen name="calendar_item_margin_right">15dp</dimen>
<dimen name="calendar_item_margin_left">13dp</dimen>
<dimen name="calendar_item_text_margin_left">7dp</dimen>
<dimen name="calendar_item_padding">11dp</dimen>
<dimen name="calendar_item_height">43dp</dimen>
<dimen name="calendar_item_text_margin_right">18dp</dimen>
<dimen name="calendar_switch_btn_width">54dp</dimen>
<dimen name="calendar_switch_btn_height">27dp</dimen>
<dimen name="calendar_inval">6dp</dimen>
<dimen name="calendar_small_circle">8dp</dimen>
<dimen name="calendar_view_height">40dp</dimen>
</resources>
================================================
FILE: app/src/main/res/values/strings.xml
================================================
<resources>
<string name="app_name">TestCal</string>
<string-array name="mult_temp_dash">
<item>寒冷</item>
<item>舒适</item>
<item>炎热</item>
</string-array>
<string-array name="mult_huim_dash">
<item>干燥</item>
<item>舒适</item>
<item>潮湿</item>
</string-array>
</resources>
================================================
FILE: app/src/main/res/values/styles.xml
================================================
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="dateStyle">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center</item>
<item name="android:textSize">12sp</item>
<item name="android:textColor">@color/base_black_title_color</item>
</style>
</resources>
================================================
FILE: app/src/test/java/com/palmwifi/testcal/ExampleUnitTest.java
================================================
package com.palmwifi.testcal;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: calendar/.gitignore
================================================
/build
================================================
FILE: calendar/build.gradle
================================================
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:recyclerview-v7:25.3.1'
}
================================================
FILE: calendar/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: calendar/src/androidTest/java/com/bin/david/calendar/ExampleInstrumentedTest.java
================================================
package com.bin.david.calendar;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.bin.david.calendar.test", appContext.getPackageName());
}
}
================================================
FILE: calendar/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bin.david.calendar" />
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarAdapter.java
================================================
package com.bin.david.calendar;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.Calendar;
/**
* Created by huang on 2017/11/22.
*/
public abstract class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHolder> {
protected Context mContext;
private CustomDate today = new CustomDate();
public static final int MONTH_MODE = 0;
public static final int WEEK_MODE = 1;
private int mode = MONTH_MODE;
public CalendarAdapter(int mode) {
this.mode = mode;
}
public CalendarAdapter() {
this.mode = MONTH_MODE;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
this.mContext = parent.getContext();
LayoutInflater mLayoutInflater = LayoutInflater.from(mContext);
CalendarView calendarView;
if(viewType == MONTH_MODE) {
calendarView = (CalendarMonthView) mLayoutInflater.inflate(R.layout.item_month_calendar, parent, false);
}else{
calendarView = (CalendarWeekView) mLayoutInflater.inflate(R.layout.item_week_calendar, parent, false);
}
decorateCalendarView(calendarView);
return new ViewHolder(calendarView);
}
//负责装饰日历
protected abstract void decorateCalendarView(CalendarView calendarView);
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Calendar calendar = Calendar.getInstance();
int realPosition = position - Integer.MAX_VALUE / 2;
if(mode == MONTH_MODE) {
CalendarMonthView monthView = (CalendarMonthView) holder.itemView;
calendar.add(Calendar.MONTH, realPosition);
CustomDate customDate = new CustomDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, 1);
monthView.setShowDate(customDate);
}else{
CalendarWeekView monthView = (CalendarWeekView)holder.itemView;
int week = calendar.get(Calendar.DAY_OF_WEEK)-1;
calendar.add(Calendar.DATE,(realPosition*7 -week));
CustomDate customDate = new CustomDate(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH));
monthView.setShowDate(customDate);
}
}
public int getMonthPosition(CustomDate customDate){
int position = (customDate.year - today.year)*12
+ (customDate.month - today.month);
return Integer.MAX_VALUE / 2 + position;
}
public int getWeekPosition(CustomDate customDate){
int day = DateUtil.betweenDays(customDate,today);
Calendar calendar = Calendar.getInstance();
int week = calendar.get(Calendar.DAY_OF_WEEK)-1;
int position = (day -week)/7;
return Integer.MAX_VALUE / 2 +position;
}
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ViewHolder(View itemView) {
super(itemView);
}
}
@Override
public int getItemViewType(int position) {
return mode;
}
public int getMode() {
return mode;
}
public void setMode(int mode) {
this.mode = mode;
notifyDataSetChanged();
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarMonthView.java
================================================
package com.bin.david.calendar;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
public class CalendarMonthView extends CalendarView {
private static final int INVALID = -1;
public CalendarMonthView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CalendarMonthView(Context context) {
super(context);
}
public CalendarMonthView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setShowDate(CustomDate showDate){
mShowDate = showDate;
fillMonthDate();
invalidate();
}
@Override
public void measureClickCell(int col, int row) {
if(mShowDate != null) {
if (col >= TOTAL_COL || row >= TOTAL_ROW)
return;
Cell cell = cells[row][col];
if (cell == null || cell.getDate() == null) {
return;
}
geCalendarDraw().onClick(this,cell);
if(getOnClickListener() != null){
getOnClickListener().onClick(this,cell);
}
fillMonthDate();
invalidate();
}
}
@Override
public int getTotalRow() {
return 6;
}
private void fillMonthDate() {
int lastMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month - 1);
int currentMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month);
int firstDayWeek = DateUtil.getWeekDayFromDate(mShowDate.year, mShowDate.month);
int day = 0;
for (int i = 0; i < TOTAL_ROW; i++) {
if(cells[i] == null){
cells[i] = new Cell[TOTAL_COL];
}
for (int j = 0; j < TOTAL_COL; j++) {
int position = j + i * TOTAL_COL;
int year = INVALID,month = INVALID,monthDay = INVALID;
if (position >= firstDayWeek && position < firstDayWeek + currentMonthDays) {
day++;
year = mShowDate.year;
month = mShowDate.month;
monthDay = day;
} else if (position < firstDayWeek) {
year = mShowDate.year;
month = mShowDate.month-1;
monthDay = lastMonthDays - (firstDayWeek - position - 1);
} else if (position >= firstDayWeek + currentMonthDays) {
year = mShowDate.year;
month = mShowDate.month + 1;
monthDay = position - firstDayWeek - currentMonthDays + 1;
}
Cell cell = cells[i][j];
if(year == INVALID){
cell.update(null,i,j);
}else {
if (cell != null && cell.getDate() != null) {
cell.getDate().update(year,month,monthDay,j);
cell.update(cell.getDate(),i,j);
} else {
CustomDate date = new CustomDate(year,month,monthDay,j);
cells[i][j] = new Cell(date, i, j);
}
}
}
}
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarRecyclerHelper.java
================================================
package com.bin.david.calendar;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PagerSnapHelper;
import android.support.v7.widget.RecyclerView;
import android.widget.AbsListView;
/**
* Created by huang on 2017/11/22.
*/
public class CalendarRecyclerHelper {
private CalendarRecyclerHelper(){}
public static void init(Context context, RecyclerView recyclerView, CalendarAdapter adapter){
init(context,recyclerView,adapter,null);
}
public static void init(Context context, RecyclerView recyclerView, CalendarAdapter adapter, final CalendarView.OnCalendarPageChanged onCalendarPageChanged){
LinearLayoutManager manager = new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false);
recyclerView.setLayoutManager(manager);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if(newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
CalendarView calendarView = (CalendarView) recyclerView.getChildAt(0);
CustomDate showDate = calendarView.getShowDate();
if(onCalendarPageChanged != null) {
onCalendarPageChanged.onPageChanged(showDate);
}
}
super.onScrollStateChanged(recyclerView, newState);
}
});
//返回当前月
if(onCalendarPageChanged != null){
onCalendarPageChanged.onPageChanged(new CustomDate());
}
recyclerView.setAdapter(adapter);
manager.scrollToPosition(Integer.MAX_VALUE/2);
new PagerSnapHelper().attachToRecyclerView(recyclerView);
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarView.java
================================================
package com.bin.david.calendar;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import java.util.ArrayList;
import java.util.List;
public abstract class CalendarView extends View {
public static final int TOTAL_COL = 7;
protected int TOTAL_ROW;
private Paint mPaint;
private int mCellSpace;
private int mCellSpaceY;
protected Cell cells[][];
private int touchSlop;
private int defaultTextColor;
private int defaultTextSize;
private CalendarDraw calendarDraw; //绘制全部交给calendarDraw
public CustomDate mShowDate;
private OnClickListener onClickListener;
public CalendarView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CalendarView(Context context) {
this(context,null);
}
public CalendarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TOTAL_ROW = getTotalRow();
cells = new Cell[TOTAL_ROW][TOTAL_COL];
init(context,attrs);
}
protected abstract void measureClickCell(int col, int row);
@Override
protected void onDraw(Canvas canvas) {
calendarDraw.onDraw(this);
Rect rect;
Cell cell;
for (int i = 0; i < TOTAL_ROW; i++) {
if (cells[i] != null) {
for(int j = 0;j <TOTAL_COL;j++){
cell = cells[i][j];
if(cell != null && cell.getDate()!=null){
rect = cell.getRect(mCellSpace,mCellSpaceY);
geCalendarDraw().onDraw(this,canvas,cell,rect, mPaint);
}
}
}
}
}
private void init(Context context,AttributeSet attrs) {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
if(attrs != null) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CalendarView);
defaultTextSize = (int) a.getDimension(R.styleable.CalendarView_baseTextSize, 25);
defaultTextColor = a.getColor(R.styleable.CalendarView_baseTextColor, Color.parseColor("#333333"));
mCellSpaceY = (int) a.getDimension(R.styleable.CalendarView_rowHeight,getResources().getDimensionPixelOffset(R.dimen.calendar_view_height));
a.recycle();
}else{
defaultTextColor = Color.parseColor("#333333");
defaultTextSize = 25;
}
touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
calendarDraw = new CalendarDraw();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width= MeasureSpec.getSize(widthMeasureSpec);
int height = mCellSpaceY *TOTAL_ROW;
setMeasuredDimension(width, height);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int mViewWidth = w;
mCellSpace = mViewWidth / TOTAL_COL;
mPaint.setTextSize(mCellSpace / 3);
}
private float mDownX;
private float mDownY;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = event.getX();
mDownY = event.getY();
break;
case MotionEvent.ACTION_UP:
float disX = event.getX() - mDownX;
float disY = event.getY() - mDownY;
if (Math.abs(disX) < touchSlop && Math.abs(disY) < touchSlop) {
int col = (int) (mDownX / mCellSpace);
int row = (int) (mDownY / mCellSpaceY);
measureClickCell(col, row);
}
break;
}
return true;
}
public Cell getCell(int row,int col) {
return cells[row][col];
}
public static class Cell {
private CustomDate date;
public int row; //行
public int col; //列
private Rect rect;
Cell(CustomDate date, int row, int col) {
this.date = date;
this.row = row;
this.col = col;
rect = new Rect();
}
void update(CustomDate date,int row,int col) {
this.date = date;
this.col = col;
this.row = row;
}
public CustomDate getDate() {
return date;
}
public Rect getRect(int perW, int perH){
int left = perW * col;
int top= row * perH;
int right = left+perW;
int bottom = top + perH;
rect.set(left,top,right,bottom);
return rect;
}
}
public CustomDate getShowDate() {
return mShowDate;
}
protected CalendarDraw geCalendarDraw() {
return calendarDraw;
}
public void addDrawFormat(IDrawFormat drawFormat){
calendarDraw.getDrawFormats().add(drawFormat);
}
public List<IDrawFormat> getDrawFormats(){
return calendarDraw.getDrawFormats();
}
public int getDefaultTextColor() {
return defaultTextColor;
}
public void setDefaultTextColor(int defaultTextColor) {
this.defaultTextColor = defaultTextColor;
}
public int getDefaultTextSize() {
return defaultTextSize;
}
public void setDefaultTextSize(int defaultTextSize) {
this.defaultTextSize = defaultTextSize;
}
/**
* Created by huang on 2017/11/22.
*/
public static class CalendarDraw implements IDrawFormat{
private List<IDrawFormat> smallDrawFormats= new ArrayList<>();
@Override
public void onDraw(CalendarView calendarView) {
int size = smallDrawFormats.size();
for(int i =0 ;i < size;i++){
smallDrawFormats.get(i).onDraw(calendarView);
}
}
@Override
public int getDateType(CalendarView calendarView, Cell cell) {
return 0;
}
public void onDraw(CalendarView calendarView, Canvas canvas, Cell cell, Rect rect, Paint paint) {
int size = smallDrawFormats.size();
for(int i =0 ;i < size;i++){
smallDrawFormats.get(i).onDraw(calendarView,canvas,cell,rect,paint);
}
}
public void onClick(CalendarView calendarView,Cell cell) {
int size = smallDrawFormats.size();
for(int i =0 ;i < size;i++){
smallDrawFormats.get(i).onClick(calendarView,cell);
}
}
public List<IDrawFormat> getDrawFormats() {
return smallDrawFormats;
}
}
public OnClickListener getOnClickListener() {
return onClickListener;
}
public void setOnClickListener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public interface OnClickListener{
void onClick(CalendarView calendarView,Cell cell);
}
public interface OnCalendarPageChanged{
void onPageChanged(CustomDate showDate);
}
public abstract int getTotalRow();
/**
* Created by huang on 2017/11/22.
*/
public static interface IDrawFormat {
void onDraw(CalendarView calendarView);
int getDateType(CalendarView calendarView, Cell cell);
void onDraw(CalendarView calendarView, Canvas canvas, Cell cell, Rect rect, Paint paint);
void onClick(CalendarView calendarView, Cell cell);
}
public static int getTextHeight(Paint paint){
Paint.FontMetrics fontMetrics = paint.getFontMetrics();
return (int) (fontMetrics.descent - fontMetrics.ascent);
}
public static float getTextCenterY(int centerY,Paint paint){
return centerY-((paint.descent() + paint.ascent()) / 2);
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarWeekView.java
================================================
package com.bin.david.calendar;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
public class CalendarWeekView extends CalendarView {
public CalendarWeekView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CalendarWeekView(Context context) {
super(context);
}
public CalendarWeekView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setShowDate(CustomDate showDate) {
mShowDate = showDate;
fillWeekDate();
invalidate();
}
@Override
public void measureClickCell(int col, int row) {
if (mShowDate != null) {
if (col >= TOTAL_COL || row >= TOTAL_ROW)
return;
Cell cell = cells[row][col];
if (cell == null || cell.getDate() == null) {
return;
}
geCalendarDraw().onClick(this, cell);
if (getOnClickListener() != null) {
getOnClickListener().onClick(this, cell);
}
fillWeekDate();
invalidate();
}
}
@Override
public int getTotalRow() {
return 1;
}
private void fillWeekDate() {
int currentMonthDays = DateUtil.getMonthDays(mShowDate.year, mShowDate.month);
cells[0] = new Cell[TOTAL_COL];
for (int j = 0; j < TOTAL_COL; j++) {
int year = mShowDate.year, month = mShowDate.month;
int monthDay = mShowDate.day + j;
if (monthDay > currentMonthDays) {
month += 1;
monthDay -= currentMonthDays;
}
Cell cell = cells[0][j];
if (cell != null && cell.getDate() != null) {
cell.getDate().update(year, month, monthDay, j);
cell.update(cell.getDate(), 0, j);
} else {
CustomDate date = new CustomDate(year, month, monthDay, j);
cells[0][j] = new Cell(date, 0, j);
}
}
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/CustomDate.java
================================================
package com.bin.david.calendar;
import java.io.Serializable;
public class CustomDate implements Serializable,Comparable<CustomDate>{
private static final long serialVersionUID = 1L;
public int year;
public int month;
public int day;
public int week;
public CustomDate(int year,int month,int day,int week){
if(month > 12){
month = 1;
year++;
}else if(month <1){
month = 12;
year--;
}
this.year = year;
this.month = month;
this.day = day;
this.week = week;
}
public void update(int year,int month,int day,int week){
if(month > 12){
month = 1;
year++;
}else if(month <1){
month = 12;
year--;
}
this.year = year;
this.month = month;
this.day = day;
this.week = week;
}
public CustomDate(int year,int month,int day){
if(month > 12){
month = 1;
year++;
}else if(month <1){
month = 12;
year--;
}
this.year = year;
this.month = month;
this.day = day;
}
public CustomDate(){
this.year = DateUtil.getYear();
this.month = DateUtil.getMonth();
this.day = DateUtil.getCurrentMonthDay();
this.week = DateUtil.getWeekDay();
}
public boolean isSameDay(CustomDate customDate){
return year == customDate.year&& customDate.month == month && day == customDate.day;
}
public boolean isSameMonth(CustomDate customDate){
return year == customDate.year&& customDate.month == month ;
}
public boolean isSameYear(CustomDate customDate){
return year == customDate.year;
}
@Override
public String toString() {
return year+"-"+month+"-"+day;
}
@Override
public int compareTo(CustomDate another) {
if(another != null){
if(this.year >another.year){
return 1;
}else if(this.year == another.year && this.month > another.month){
return 1;
}else if(this.year == another.year && this.month == another.month && this.day >another.day){
return 1;
}else if(this.year == another.year && this.month == another.month && this.day == another.day){
return 0;
}
return -1;
}
return -1;
}
public int compareDays(CustomDate another){
if(this.month == another.month){
return this.day - another.day;
}else{
int days = DateUtil.getMonthDays(another.year,another.month);
return days - another.day + this.day;
}
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/DateUtil.java
================================================
package com.bin.david.calendar;
import android.annotation.SuppressLint;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtil {
public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
public static int getMonthDays(int year, int month) {
if (month > 12) {
month = 1;
year += 1;
} else if (month < 1) {
month = 12;
year -= 1;
}
int[] arr = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int days = 0;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
arr[1] = 29;
}
try {
days = arr[month - 1];
} catch (Exception e) {
e.getStackTrace();
}
return days;
}
public static int getYear() {
return Calendar.getInstance().get(Calendar.YEAR);
}
public static int getMonth() {
return Calendar.getInstance().get(Calendar.MONTH) + 1;
}
public static int getCurrentMonthDay() {
return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
}
public static int getWeekDay() {
return Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
}
public static int getHour() {
return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
}
public static int getMinute() {
return Calendar.getInstance().get(Calendar.MINUTE);
}
public static int getWeekDayFromDate(int year, int month) {
Calendar cal = Calendar.getInstance();
cal.setTime(getDateFromString(year, month));
int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (week_index < 0) {
week_index = 0;
}
return week_index;
}
@SuppressLint("SimpleDateFormat")
public static Date getDateFromString(int year, int month) {
String dateString = year + "-" + (month > 9 ? month : ("0" + month))
+ "-01";
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(dateString);
} catch (ParseException e) {
System.out.println(e.getMessage());
}
return date;
}
public static boolean isToday(CustomDate date){
return(date.year == DateUtil.getYear() &&
date.month == DateUtil.getMonth()
&& date.day == DateUtil.getCurrentMonthDay());
}
public static boolean isCurrentMonth(CustomDate date){
return(date.year == DateUtil.getYear() &&
date.month == DateUtil.getMonth());
}
public static int betweenDays(CustomDate date, CustomDate compareDate){
int dayCount = 0;
try {
Date date1 = simpleDateFormat.parse(date.year+(date.month<10?"0"+date.month :""+date.month)+""+(date.day<10?"0"+date.day:""+date.day));
Date compareDate1 = simpleDateFormat.parse(compareDate.year+(compareDate.month<10?"0"+compareDate.month :""+compareDate.month)+""+(compareDate.day<10?"0"+compareDate.day:""+compareDate.day));
dayCount = (int) ((date1.getTime()-compareDate1.getTime())/(3600000*24));
} catch (ParseException e) {
e.printStackTrace();
}
return dayCount;
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/LunarCalendar.java
================================================
package com.bin.david.calendar;
import android.text.TextUtils;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
@SuppressWarnings("unused")
class LunarCalendar {
/**
* 支持转换的最小农历年份
*/
private static final int MIN_YEAR = 1900;
/**
* 支持转换的最大农历年份
*/
private static final int MAX_YEAR = 2099;
/**
* 公历每月前的天数
*/
private static final int DAYS_BEFORE_MONTH[] = {0, 31, 59, 90, 120, 151, 181,
212, 243, 273, 304, 334, 365};
/**
* 农历月份第一天转写
*/
private static final String[] monthStr = {"春节", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月"};
/**
* 传统农历节日
*/
private static final String[] traditionFestivalStr = {"除夕", "0101春节", "0115元宵", "0505端午", "0707七夕", "0815中秋", "0909重阳"};
/**
* 农历大写
*/
private static final String daysStr[] = {"初一", "初二", "初三", "初四", "初五", "初六",
"初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七",
"十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八",
"廿九", "三十"};
/**
* 公历节日
*/
private final static String[] mSolarCalendar = {
"0101元旦", "0214情人节", "0315消权日", "0401愚人节", "0501劳动节", "0504青年节",
"0601儿童节", "0701建党节", "0801建军节", "0910教师节", "1001国庆节", "1224平安夜",
"1225圣诞节"
};
/**
* 返回传统农历节日
*
* @param year 农历年
* @param month 农历月
* @param day 农历日
* @return 返回传统农历节日
*/
private static String getTraditionFestivalText(int year, int month, int day) {
if (month == 12) {
int count = daysInLunarMonth(year, month);
if (day == count) {
return traditionFestivalStr[0];//除夕
}
}
String text = getString(month, day);
String festivalStr = "";
for (String festival : traditionFestivalStr) {
if (festival.contains(text)) {
festivalStr = festival.replace(text, "");
break;
}
}
return festivalStr;
}
/**
* 数字转换为汉字月份
*
* @param month 月
* @return 数字转换为汉字月份
*/
private static String numToChineseMonth(int month) {
return monthStr[month - 1];
}
/**
* 数字转换为汉字日
*
* @param day day
* @return 数字转换为汉字日
*/
static String numToChineseDay(int day) {
return daysStr[day - 1];
}
/**
* 数字转换为农历节日或者日期
*
* @param month 月
* @param day 日
* @return 数字转换为汉字日
*/
private static String numToChinese(int month, int day) {
if (day == 1) {
return numToChineseMonth(month);
}
return daysStr[day - 1];
}
/**
* 用来表示1900年到2099年间农历年份的相关信息,共24位bit的16进制表示,其中:
* 1. 前4位表示该年闰哪个月;
* 2. 5-17位表示农历年份13个月的大小月分布,0表示小,1表示大;
* 3. 最后7位表示农历年首(正月初一)对应的公历日期。
* <p/>
* 以2014年的数据0x955ABF为例说明:
* 1001 0101 0101 1010 1011 1111
* 闰九月 农历正月初一对应公历1月31号
*/
private static final int LUNAR_INFO[] = {
0x84B6BF,/*1900*/
0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A,/*1901-1910*/
0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754,/*1911-1920*/
0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E,/*1921-1930*/
0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48,/*1931-1940*/
0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51,/*1941-1950*/
0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C,/*1951-1960*/
0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46,/*1961-1970*/
0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50,/*1971-1980*/
0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x095746, 0x5497BB,/*1981-1990*/
0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645,/*1991-2000*/
0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E,/*2001-2010*/
0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9,/*2011-2020*/
0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x6a573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43,/*2021-2030*/
0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C,/*2031-2040*/
0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37,/*2041-2050*/
0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06AA44, 0x4AB638, 0x0AAE4C, 0x092E42,/*2051-2060*/
0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B,/*2061-2070*/
0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6,/*2071-2080*/
0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E,/*2081-2090*/
0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5 /*2091-2099*/
};
/**
* 将农历日期转换为公历日期
*
* @param year 农历年份
* @param month 农历月
* @param monthDay 农历日
* @param isLeapMonth 该月是否是闰月
* @return 返回农历日期对应的公历日期,year0, month1, day2.
*/
static int[] lunarToSolar(int year, int month, int monthDay,
boolean isLeapMonth) {
int dayOffset;
int leapMonth;
int i;
if (year < MIN_YEAR || year > MAX_YEAR || month < 1 || month > 12
|| monthDay < 1 || monthDay > 30) {
throw new IllegalArgumentException(
"Illegal lunar date, must be like that:\n\t" +
"year : 1900~2099\n\t" +
"month : 1~12\n\t" +
"day : 1~30");
}
dayOffset = (LUNAR_INFO[year - MIN_YEAR] & 0x001F) - 1;
if (((LUNAR_INFO[year - MIN_YEAR] & 0x0060) >> 5) == 2)
dayOffset += 31;
for (i = 1; i < month; i++) {
if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (i - 1))) == 0)
dayOffset += 29;
else
dayOffset += 30;
}
dayOffset += monthDay;
leapMonth = (LUNAR_INFO[year - MIN_YEAR] & 0xf00000) >> 20;
// 这一年有闰月
if (leapMonth != 0) {
if (month > leapMonth || (month == leapMonth && isLeapMonth)) {
if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (month - 1))) == 0)
dayOffset += 29;
else
dayOffset += 30;
}
}
if (dayOffset > 366 || (year % 4 != 0 && dayOffset > 365)) {
year += 1;
if (year % 4 == 1)
dayOffset -= 366;
else
dayOffset -= 365;
}
int[] solarInfo = new int[3];
for (i = 1; i < 13; i++) {
int iPos = DAYS_BEFORE_MONTH[i];
if (year % 4 == 0 && i > 2) {
iPos += 1;
}
if (year % 4 == 0 && i == 2 && iPos + 1 == dayOffset) {
solarInfo[1] = i;
solarInfo[2] = dayOffset - 31;
break;
}
if (iPos >= dayOffset) {
solarInfo[1] = i;
iPos = DAYS_BEFORE_MONTH[i - 1];
if (year % 4 == 0 && i > 2) {
iPos += 1;
}
if (dayOffset > iPos)
solarInfo[2] = dayOffset - iPos;
else if (dayOffset == iPos) {
if (year % 4 == 0 && i == 2)
solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1] + 1;
else
solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1];
} else
solarInfo[2] = dayOffset;
break;
}
}
solarInfo[0] = year;
return solarInfo;
}
/**
* 将公历日期转换为农历日期,且标识是否是闰月
*
* @param year year
* @param month month
* @param monthDay monthDay
* @return 返回公历日期对应的农历日期,year0,month1,day2,leap3
*/
static int[] solarToLunar(int year, int month, int monthDay) {
int[] lunarDate = new int[4];
Date baseDate = new GregorianCalendar(1900, 0, 31).getTime();
Date objDate = new GregorianCalendar(year, month - 1, monthDay).getTime();
int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);
// 用offset减去每农历年的天数计算当天是农历第几天
// iYear最终结果是农历的年份, offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = MIN_YEAR; iYear <= MAX_YEAR && offset > 0; iYear++) {
daysOfYear = daysInLunarYear(iYear);
offset -= daysOfYear;
}
if (offset < 0) {
offset += daysOfYear;
iYear--;
}
// 农历年份
lunarDate[0] = iYear;
int leapMonth = leapMonth(iYear); // 闰哪个月,1-12
boolean isLeap = false;
// 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
int iMonth, daysOfMonth = 0;
for (iMonth = 1; iMonth <= 13 && offset > 0; iMonth++) {
daysOfMonth = daysInLunarMonth(iYear, iMonth);
offset -= daysOfMonth;
}
// 当前月超过闰月,要校正
if (leapMonth != 0 && iMonth > leapMonth) {
--iMonth;
if (iMonth == leapMonth) {
isLeap = true;
}
}
// offset小于0时,也要校正
if (offset < 0) {
offset += daysOfMonth;
--iMonth;
}
lunarDate[1] = iMonth;
lunarDate[2] = offset + 1;
lunarDate[3] = isLeap ? 1 : 0;
return lunarDate;
}
/**
* y
* 传回农历year年month月的总天数
*
* @param year 要计算的年份
* @param month 要计算的月
* @return 传回天数
*/
private static int daysInMonth(int year, int month) {
return daysInMonth(year, month, false);
}
/**
* 传回农历year年month月的总天数
*
* @param year 要计算的年份
* @param month 要计算的月
* @param leap 当月是否是闰月
* @return 传回天数,如果闰月是错误的,返回0.
*/
@SuppressWarnings("all")
private static int daysInMonth(int year, int month, boolean leap) {
int leapMonth = leapMonth(year);
int offset = 0;
// 如果本年有闰月且month大于闰月时,需要校正
if (leapMonth != 0 && month > leapMonth) {
offset = 1;
}
// 不考虑闰月
if (!leap) {
return daysInLunarMonth(year, month + offset);
} else {
// 传入的闰月是正确的月份
if (leapMonth != 0 && leapMonth == month) {
return daysInLunarMonth(year, month + 1);
}
}
return 0;
}
/**
* 传回农历 year年的总天数
*
* @param year 将要计算的年份
* @return 返回传入年份的总天数
*/
private static int daysInLunarYear(int year) {
int i, sum = 348;
if (leapMonth(year) != 0) {
sum = 377;
}
int monthInfo = LUNAR_INFO[year - MIN_YEAR] & 0x0FFF80;
for (i = 0x80000; i > 0x7; i >>= 1) {
if ((monthInfo & i) != 0)
sum += 1;
}
return sum;
}
/**
* 传回农历 year年month月的总天数,总共有13个月包括闰月
*
* @param year 将要计算的年份
* @param month 将要计算的月份
* @return 传回农历 year年month月的总天数
*/
private static int daysInLunarMonth(int year, int month) {
if ((LUNAR_INFO[year - MIN_YEAR] & (0x100000 >> month)) == 0)
return 29;
else
return 30;
}
/**
* 传回农历 year年闰哪个月 1-12 , 没闰传回 0
*
* @param year 将要计算的年份
* @return 传回农历 year年闰哪个月1-12, 没闰传回 0
*/
private static int leapMonth(int year) {
return ((LUNAR_INFO[year - MIN_YEAR] & 0xF00000)) >> 20;
}
private final static int[] solarTermInfo = {
0, 21208, 42467, 63836, 85337, 107014, 128867, 150921,
173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033,
353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758
};
/**
* 获取公历节日
*
* @param month 公历月份
* @param day 公历日期
* @return 公历节日
*/
public static String getSolarCalendar(int month, int day) {
String text = getString(month, day);
String solar = "";
for (String aMSolarCalendar : mSolarCalendar) {
if (aMSolarCalendar.contains(text)) {
solar = aMSolarCalendar.replace(text, "");
break;
}
}
return solar;
}
private static String getString(int month, int day) {
return (month >= 10 ? String.valueOf(month) : "0" + month) + (day >= 10 ? day : "0" + day);
}
/**
* 农历24节气
*/
private final static String[] mSolarTerm = {
"小寒", "大寒", "立春", "雨水", "惊蛰", "春分",
"清明", "谷雨", "立夏", "小满", "芒种", "夏至",
"小暑", "大暑", "立秋", "处暑", "白露", "秋分",
"寒露", "霜降", "立冬", "小雪", "大雪", "冬至"
};
/**
* 返回24节气
*/
public static String getTermString(int solarYear, int solarMonth, int solarDay) {
String termString = "";
if (getSolarTermDay(solarYear, solarMonth * 2) == solarDay) {
termString = mSolarTerm[solarMonth * 2];
} else if (getSolarTermDay(solarYear, solarMonth * 2 + 1) == solarDay) {
termString = mSolarTerm[solarMonth * 2 + 1];
}
return termString;
}
/**
* 返回公历年节气的日期
*
* @param solarYear 指定公历年份(数字)
* @param index 指定节气序号(数字,0从小寒算起)
* @return 日期(数字, 所在月份的第几天)
*/
private static int getSolarTermDay(int solarYear, int index) {
return getUTCDay(getSolarTermCalendar(solarYear, index));
}
/**
* 返回公历年节气的日期
*
* @param solarYear 指定公历年份(数字)
* @param index 指定节气序号(数字,0从小寒算起)
* @return 日期(数字, 所在月份的第几天)
*/
private static Date getSolarTermCalendar(int solarYear, int index) {
long l = (long) 31556925974.7 * (solarYear - 1900)
+ solarTermInfo[index] * 60000L;
l = l + UTC(1900, 0, 6, 2, 5, 0);
return new Date(l);
}
/**
* 返回全球标准时间 (UTC) (或 GMT) 的 1970 年 1 月 1 日到所指定日期之间所间隔的毫秒数。
*
* @param y 指定年份
* @param m 指定月份
* @param d 指定日期
* @param h 指定小时
* @param min 指定分钟
* @param sec 指定秒数
* @return 全球标准时间 (UTC) (或 GMT) 的 1970 年 1 月 1 日到所指定日期之间所间隔的毫秒数
*/
@SuppressWarnings("all")
private static synchronized long UTC(int y, int m, int d, int h, int min, int sec) {
makeUTCCalendar();
synchronized (utcCal) {
utcCal.clear();
utcCal.set(y, m, d, h, min, sec);
return utcCal.getTimeInMillis();
}
}
private static GregorianCalendar utcCal = null;
/**
* 取 Date 对象中用全球标准时间 (UTC) 表示的日期
*
* @param date 指定日期
* @return UTC 全球标准时间 (UTC) 表示的日期
*/
@SuppressWarnings("SynchronizeOnNonFinalField")
private static synchronized int getUTCDay(Date date) {
makeUTCCalendar();
synchronized (utcCal) {
utcCal.clear();
utcCal.setTimeInMillis(date.getTime());
return utcCal.get(java.util.Calendar.DAY_OF_MONTH);
}
}
private static void makeUTCCalendar() {
if (utcCal == null) {
utcCal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
}
}
/**
* 检查节气是否加1 ,例如青梅是4号还是5号
*
* @param year 今年
* @return 检查节气偏移量
*/
@SuppressWarnings("all")
static int getTermsOffset(int year) {
boolean isLeapYear = isLeapYear(year);
int d = getWinterSolstice(year - 1);//获取去年冬至是21还是22,农历
if (d == 22 && isLeapYear) return 2;//几百年才几次出现清明是6号
if (d == 22) return 1;
return 0;
}
/**
* 判断是否闰年
*
* @param year year
* @return 是否闰年
*/
private static boolean isLeapYear(int year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
private final static double D = 0.2422;
private final static double C = 21.94;// (year*D + C) - leap 20世纪C=22.60
/**
* 冬至是每年的第几日 21 or 22
*/
private static int getWinterSolstice(int year) {
int dYear = Integer.parseInt(String.valueOf(year).substring(2, 4));
return (int) (dYear * D + C - (dYear / 4));
}
/**
* 获取农历节日
*
* @param year 年
* @param month 月
* @param day 日
* @return 农历节日
*/
public static String getLunarText(int year, int month, int day) {
String termText = LunarCalendar.getTermString(year, month - 1, day);
String solar = LunarCalendar.getSolarCalendar(month, day);
if (!TextUtils.isEmpty(solar))
return solar;
if (!TextUtils.isEmpty(termText))
return termText;
return getLunar(year, month, day);
}
public static String getLunar(int year, int month, int day) {
int[] lunar = LunarCalendar.solarToLunar(year, month, day);
String festival = getTraditionFestivalText(lunar[0], lunar[1], lunar[2]);
if (!TextUtils.isEmpty(festival))
return festival;
return LunarCalendar.numToChinese(lunar[1], lunar[2]);
}
}
================================================
FILE: calendar/src/main/java/com/bin/david/calendar/TextDrawFormat.java
================================================
package com.bin.david.calendar;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.text.TextUtils;
/**
* Created by huang on 2017/11/22.
*/
public abstract class TextDrawFormat implements CalendarView.IDrawFormat {
private boolean isDrawLunar;
private int interval = 5;
public static final int FESTIVAL = 2; //节日
public static final int SOLAR = 1; //节气
public static final int DAY = 0; //普通日子
@Override
public void onClick(CalendarView calendarView,CalendarView.Cell cell) {
}
@Override
public void onDraw(CalendarView calendarView, Canvas canvas, CalendarView.Cell cell, Rect rect, Paint paint) {
int type = getDateType(calendarView,cell);
onDrawBackground(canvas,type,rect,paint);
paint.setTextSize(calendarView.getDefaultTextSize());
paint.setColor(calendarView.getDefaultTextColor());
onDrawBefore(canvas,type,rect,paint);
if(isDraw(type)) {
drawText(calendarView, canvas,type, cell, rect, paint);
}
onDrawOver(canvas,type,rect,paint);
}
//绘制背景
public void onDrawBackground(Canvas canvas,int type,Rect rect, Paint paint){
}
//绘制公历之前 可以设置公历字体和颜色
public void onDrawBefore(Canvas canvas,int type,Rect rect, Paint paint){
}
//绘制农历之前 可以用来绘制背景和改变字体大小颜色
public void onDrawLunarBefore(Canvas canvas,int type,Rect rect,int dayLevel,Paint paint){
}
//绘制之后
public void onDrawOver(Canvas canvas,int type,Rect rect, Paint paint){
}
public abstract boolean isDraw(int type);
public String getContent(CalendarView.Cell cell,int type){
return cell.getDate().day + "";
}
private void drawText(CalendarView calendarView,Canvas canvas,int type, CalendarView.Cell cell, Rect rect, Paint paint) {
paint.setStyle(Paint.Style.FILL);
paint.setTextAlign(Paint.Align.CENTER);
if(isDrawLunar) {
//绘制公历
CustomDate date = cell.getDate();
canvas.drawText(getContent(cell,getDateType(calendarView,cell)), rect.centerX(),
CalendarView.getTextCenterY(rect.centerY()-interval, paint), paint);
int textHeight = CalendarView.getTextHeight(paint);
//绘制农历
int dayLevel = DAY;
String lunar = LunarCalendar.getSolarCalendar(date.month,date.day);
if(!TextUtils.isEmpty(lunar)){
dayLevel = FESTIVAL;
}else {
lunar = LunarCalendar.getTermString(date.year, date.month - 1, date.day);
if (!TextUtils.isEmpty(lunar)) {
dayLevel = SOLAR;
}else{
lunar = LunarCalendar.getLunar(date.year,date.month,date.day);
}
}
onDrawLunarBefore(canvas,type,rect,dayLevel,paint);
canvas.drawText(lunar,
rect.centerX(),
CalendarView.getTextCenterY(rect.centerY()+textHeight/2, paint), paint);
}else{
canvas.drawText(getContent(cell,getDateType(calendarView,cell)), rect.centerX(),
CalendarView.getTextCenterY(rect.centerY(), paint), paint);
}
}
public boolean isDrawLunar() {
return isDrawLunar;
}
public void setDrawLunar(boolean drawLunar) {
isDrawLunar = drawLunar;
}
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
@Override
public void onDraw(CalendarView calendarView) {
}
}
================================================
FILE: calendar/src/main/res/layout/item_month_calendar.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<com.bin.david.calendar.CalendarMonthView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:baseTextSize="14sp">
</com.bin.david.calendar.CalendarMonthView>
================================================
FILE: calendar/src/main/res/layout/item_week_calendar.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<com.bin.david.calendar.CalendarWeekView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:baseTextSize="14sp">
</com.bin.david.calendar.CalendarWeekView>
================================================
FILE: calendar/src/main/res/values/attrs.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CalendarView">
<attr name="baseTextColor" format="color"/>
<attr name="baseTextSize" format="dimension"/>
<attr name="rowHeight" format="dimension"/>
</declare-styleable>
</resources>
================================================
FILE: calendar/src/main/res/values/dimens.xml
================================================
<resources>
<dimen name="calendar_view_height">40dp</dimen>
</resources>
================================================
FILE: calendar/src/main/res/values/strings.xml
================================================
<resources>
<string name="app_name">calendar</string>
</resources>
================================================
FILE: calendar/src/test/java/com/bin/david/calendar/ExampleUnitTest.java
================================================
package com.bin.david.calendar;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: gradle/wrapper/gradle-wrapper.jar
================================================
, 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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
2017-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
gitextract_9beznimz/ ├── .gitignore ├── .idea/ │ ├── compiler.xml │ ├── copyright/ │ │ └── profiles_settings.xml │ ├── gradle.xml │ ├── markdown-navigator/ │ │ └── profiles_settings.xml │ ├── markdown-navigator.xml │ ├── misc.xml │ ├── misc.xml___jb_old___ │ ├── modules.xml │ ├── runConfigurations.xml │ └── vcs.xml ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── palmwifi/ │ │ └── testcal/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── palmwifi/ │ │ │ └── testcal/ │ │ │ ├── CalendarActivity.java │ │ │ ├── CalendarMonthActivity.java │ │ │ ├── CalendarWeekActivity.java │ │ │ ├── DashBoardActivity.java │ │ │ ├── HomeActivity.java │ │ │ ├── RingActivity.java │ │ │ ├── calendar/ │ │ │ │ ├── CalendarMonthView.java │ │ │ │ ├── CalendarView.java │ │ │ │ ├── CalendarViewBuilder.java │ │ │ │ ├── CalendarViewPagerAdapter.java │ │ │ │ ├── CalendarViewPagerListener.java │ │ │ │ ├── CustomDate.java │ │ │ │ ├── DateUtil.java │ │ │ │ ├── OnCalenderListener.java │ │ │ │ └── RecordState.java │ │ │ ├── dash/ │ │ │ │ ├── DashboardView.java │ │ │ │ └── RingView.java │ │ │ ├── newcalendar/ │ │ │ │ ├── CustomCalendarAdapter.java │ │ │ │ └── CustomTextDrawFormat.java │ │ │ └── utils/ │ │ │ └── DensityUtils.java │ │ └── res/ │ │ ├── layout/ │ │ │ ├── ac_dash_broad.xml │ │ │ ├── ac_home.xml │ │ │ ├── ac_ring.xml │ │ │ ├── activity_calendar.xml │ │ │ └── activity_main.xml │ │ └── values/ │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── palmwifi/ │ └── testcal/ │ └── ExampleUnitTest.java ├── build.gradle ├── calendar/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── bin/ │ │ └── david/ │ │ └── calendar/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── bin/ │ │ │ └── david/ │ │ │ └── calendar/ │ │ │ ├── CalendarAdapter.java │ │ │ ├── CalendarMonthView.java │ │ │ ├── CalendarRecyclerHelper.java │ │ │ ├── CalendarView.java │ │ │ ├── CalendarWeekView.java │ │ │ ├── CustomDate.java │ │ │ ├── DateUtil.java │ │ │ ├── LunarCalendar.java │ │ │ └── TextDrawFormat.java │ │ └── res/ │ │ ├── layout/ │ │ │ ├── item_month_calendar.xml │ │ │ └── item_week_calendar.xml │ │ └── values/ │ │ ├── attrs.xml │ │ ├── dimens.xml │ │ └── strings.xml │ └── test/ │ └── java/ │ └── com/ │ └── bin/ │ └── david/ │ └── calendar/ │ └── ExampleUnitTest.java ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle
SYMBOL INDEX (331 symbols across 33 files)
FILE: app/src/androidTest/java/com/palmwifi/testcal/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 19) | @Test
FILE: app/src/main/java/com/palmwifi/testcal/CalendarActivity.java
class CalendarActivity (line 21) | public class CalendarActivity extends AppCompatActivity implements OnCal...
method onCreate (line 34) | @Override
method setViewPager (line 49) | private void setViewPager() {
method clickDate (line 66) | @Override
method showDate (line 71) | @Override
method onMeasureCellHeight (line 80) | @Override
method changeRowCount (line 91) | @Override
method setSignDateStatus (line 101) | @Override
method onClick (line 115) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/CalendarMonthActivity.java
class CalendarMonthActivity (line 18) | public class CalendarMonthActivity extends AppCompatActivity{
method onCreate (line 23) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/CalendarWeekActivity.java
class CalendarWeekActivity (line 18) | public class CalendarWeekActivity extends AppCompatActivity{
method onCreate (line 23) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/DashBoardActivity.java
class DashBoardActivity (line 13) | public class DashBoardActivity extends AppCompatActivity {
method onCreate (line 22) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/HomeActivity.java
class HomeActivity (line 13) | public class HomeActivity extends AppCompatActivity implements View.OnCl...
method onCreate (line 17) | @Override
method onClick (line 29) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/RingActivity.java
class RingActivity (line 13) | public class RingActivity extends AppCompatActivity {
method onCreate (line 20) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarMonthView.java
class CalendarMonthView (line 8) | public class CalendarMonthView extends CalendarView {
method CalendarMonthView (line 19) | public CalendarMonthView(Context context, AttributeSet attrs) {
method CalendarMonthView (line 24) | public CalendarMonthView(Context context, OnCalenderListener callBack) {
method CalendarMonthView (line 31) | public CalendarMonthView(Context context) {
method initDate (line 37) | @Override
method measureClickCell (line 44) | @Override
method fillDate (line 60) | private void fillDate() {
method fillMonthDate (line 65) | private void fillMonthDate(boolean isChangeClick) {
method update (line 130) | @Override
method backToday (line 137) | @Override
method update (line 143) | @Override
method getClickDate (line 153) | @Override
method getRecordDateState (line 159) | @Override
method rightSlide (line 170) | public void rightSlide() {
method leftSlide (line 182) | public void leftSlide() {
method setOnCalenderListener (line 195) | public void setOnCalenderListener(OnCalenderListener callBack) {
method getOnCalenderListener (line 199) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarView.java
class CalendarView (line 16) | public abstract class CalendarView extends View {
method CalendarView (line 33) | public CalendarView(Context context, AttributeSet attrs) {
method CalendarView (line 38) | public CalendarView(Context context) {
method update (line 44) | public abstract void update();
method backToday (line 46) | public abstract void backToday();
method update (line 48) | public abstract void update(CustomDate showDate, CustomDate clickDate);
method getClickDate (line 50) | public abstract CustomDate getClickDate();
method getRecordDateState (line 53) | public abstract RecordState getRecordDateState(CustomDate date);
method rightSlide (line 56) | public abstract void rightSlide();
method leftSlide (line 58) | public abstract void leftSlide();
method setOnCalenderListener (line 60) | public abstract void setOnCalenderListener(OnCalenderListener callBack);
method measureClickCell (line 62) | protected abstract void measureClickCell(int col, int row);
method getOnCalenderListener (line 64) | public abstract OnCalenderListener getOnCalenderListener();
method initDate (line 66) | protected abstract void initDate();
method onDraw (line 68) | @Override
method init (line 78) | private void init(Context context) {
method onSizeChanged (line 88) | @Override
method onTouchEvent (line 104) | @Override
class Row (line 124) | class Row {
method Row (line 127) | Row(int j) {
method drawCells (line 133) | public void drawCells(Canvas canvas) {
class Cell (line 152) | class Cell {
method Cell (line 159) | public Cell(CustomDate date, State state, RecordState recordState, i...
method update (line 167) | public void update(CustomDate date, State state, RecordState recordS...
method drawSelf (line 173) | public void drawSelf(Canvas canvas,Cell perCell,Cell nextCell) {
method updateCellData (line 245) | protected void updateCellData(int row, int col, CustomDate date, State...
type State (line 255) | enum State {
method isAutoClickFirstDay (line 259) | public boolean isAutoClickFirstDay() {
method setAutoClickFirstDay (line 263) | public void setAutoClickFirstDay(boolean autoClickFirstDay) {
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewBuilder.java
class CalendarViewBuilder (line 6) | public class CalendarViewBuilder {
method createMonthCalendarViews (line 9) | public static CalendarView[] createMonthCalendarViews(Context context,
method createMonthCalendarViews (line 14) | public static CalendarView[] createMonthCalendarViews(Context context,
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerAdapter.java
class CalendarViewPagerAdapter (line 9) | public class CalendarViewPagerAdapter<V extends View> extends PagerAdapt...
method CalendarViewPagerAdapter (line 14) | public CalendarViewPagerAdapter(V[] views) {
method finishUpdate (line 19) | @Override
method notifyDataSetChanged (line 23) | @Override
method getCount (line 28) | @Override
method instantiateItem (line 33) | @Override
method isViewFromObject (line 44) | @Override
method saveState (line 49) | @Override
method destroyItem (line 54) | @Override
method startUpdate (line 60) | @Override
method getAllItems (line 65) | public V[] getAllItems() {
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerListener.java
class CalendarViewPagerListener (line 7) | public class CalendarViewPagerListener implements OnPageChangeListener {
method CalendarViewPagerListener (line 15) | public CalendarViewPagerListener(ViewPager viewPager, CalendarViewPage...
method onPageSelected (line 20) | @Override
method updateCalendarView (line 26) | private void updateCalendarView(int arg0) {
method measureDirection (line 38) | private void measureDirection(int arg0) {
method onPageScrolled (line 49) | @Override
method onPageScrollStateChanged (line 53) | @Override
method getCurrentCalendar (line 60) | public CalendarView getCurrentCalendar(){
method updateCalendar (line 66) | public void updateCalendar(){
method backToday (line 71) | public void backToday(){
type SlideDirection (line 78) | enum SlideDirection {
FILE: app/src/main/java/com/palmwifi/testcal/calendar/CustomDate.java
class CustomDate (line 5) | public class CustomDate implements Serializable,Comparable<CustomDate>{
method CustomDate (line 14) | public CustomDate(int year,int month,int day,int week){
method CustomDate (line 28) | public CustomDate(int year,int month,int day){
method CustomDate (line 41) | public CustomDate(){
method modifiDayForObject (line 48) | public static CustomDate modifiDayForObject(CustomDate date,int day,in...
method getYear (line 54) | public int getYear() {
method setYear (line 58) | public void setYear(int year) {
method getMonth (line 62) | public int getMonth() {
method setMonth (line 66) | public void setMonth(int month) {
method getDay (line 70) | public int getDay() {
method setDay (line 74) | public void setDay(int day) {
method isSameDay (line 79) | public boolean isSameDay(CustomDate customDate){
method getWeek (line 83) | public int getWeek() {
method setWeek (line 87) | public void setWeek(int week) {
method toString (line 91) | @Override
method compareTo (line 97) | @Override
method compareDays (line 115) | public int compareDays(CustomDate another){
FILE: app/src/main/java/com/palmwifi/testcal/calendar/DateUtil.java
class DateUtil (line 11) | public class DateUtil {
method getMonthDays (line 15) | public static int getMonthDays(int year, int month) {
method getYear (line 39) | public static int getYear() {
method getMonth (line 43) | public static int getMonth() {
method getCurrentMonthDay (line 47) | public static int getCurrentMonthDay() {
method getWeekDay (line 51) | public static int getWeekDay() {
method getHour (line 55) | public static int getHour() {
method getMinute (line 58) | public static int getMinute() {
method getWeekDayFromDate (line 65) | public static int getWeekDayFromDate(int year, int month) {
method getDateFromString (line 75) | @SuppressLint("SimpleDateFormat")
method isToday (line 88) | public static boolean isToday(CustomDate date){
method isCurrentMonth (line 94) | public static boolean isCurrentMonth(CustomDate date){
method betweenDays (line 99) | public static int betweenDays(CustomDate date, CustomDate compareDate){
class State (line 114) | public static class State{
method State (line 117) | public State(String tip, int day) {
FILE: app/src/main/java/com/palmwifi/testcal/calendar/OnCalenderListener.java
type OnCalenderListener (line 4) | public interface OnCalenderListener {
method clickDate (line 6) | void clickDate(CustomDate date);
method showDate (line 8) | void showDate(CustomDate date);
method onMeasureCellHeight (line 10) | void onMeasureCellHeight(int cellSpace);
method changeRowCount (line 13) | void changeRowCount(int rows);
method setSignDateStatus (line 15) | RecordState setSignDateStatus(CustomDate date);
FILE: app/src/main/java/com/palmwifi/testcal/calendar/RecordState.java
type RecordState (line 6) | public enum RecordState {
FILE: app/src/main/java/com/palmwifi/testcal/dash/DashboardView.java
class DashboardView (line 25) | public class DashboardView extends View {
method DashboardView (line 72) | public DashboardView(Context context) {
method DashboardView (line 77) | public DashboardView(Context context, AttributeSet attrs) {
method DashboardView (line 83) | public DashboardView(Context context, AttributeSet attrs, int defStyle) {
method initAttr (line 89) | private void initAttr(AttributeSet attrs) {
method initView (line 123) | protected void initView() {
method onDraw (line 167) | @Override
method getAngle (line 254) | public int getAngle() {
method setAngle (line 258) | public void setAngle(int angle) {
method setAngleWithAnim (line 263) | public void setAngleWithAnim(int angle) {
method setAngleWithAnim (line 274) | public void setAngleWithAnim(double angle) {
method run (line 284) | @Override
method initDash (line 304) | public void initDash(int startNum, int[] eachInterval, String[] interv...
method initDash (line 310) | public void initDash(int startNum, int[] eachInterval, String[] interv...
method initDash (line 322) | public void initDash(int startNum, int[] eachInterval, String[] interv...
FILE: app/src/main/java/com/palmwifi/testcal/dash/RingView.java
class RingView (line 31) | public class RingView extends View {
method RingView (line 64) | public RingView(Context context) {
method RingView (line 69) | public RingView(Context context, AttributeSet attrs) {
method RingView (line 75) | public RingView(Context context, AttributeSet attrs, int defStyle) {
method initAttr (line 81) | private void initAttr(AttributeSet attrs) {
method initView (line 95) | protected void initView() {
method onTouchEvent (line 124) | @Override
method onDraw (line 162) | @Override
method initDash (line 227) | public void initDash(String[] intervalStrs, int[] colors) {
method startAnim (line 234) | public void startAnim(final int anim) {
method start (line 259) | public void start(final int anim) {
method setOnDashItemClickListener (line 278) | public void setOnDashItemClickListener(OnDashItemClickListener itemCli...
method setSelectPosition (line 283) | public void setSelectPosition(int selectPosition) {
method setTotalSection (line 296) | public void setTotalSection(int totalSection) {
type OnDashItemClickListener (line 301) | public interface OnDashItemClickListener {
method onItemClick (line 303) | void onItemClick(RingView dashView, int position);
FILE: app/src/main/java/com/palmwifi/testcal/newcalendar/CustomCalendarAdapter.java
class CustomCalendarAdapter (line 11) | public class CustomCalendarAdapter extends CalendarAdapter {
method CustomCalendarAdapter (line 14) | public CustomCalendarAdapter(int mode) {
method CustomCalendarAdapter (line 18) | public CustomCalendarAdapter() {
method decorateCalendarView (line 21) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/newcalendar/CustomTextDrawFormat.java
class CustomTextDrawFormat (line 21) | public class CustomTextDrawFormat extends TextDrawFormat {
method CustomTextDrawFormat (line 34) | public CustomTextDrawFormat(Context context) {
method onDrawBackground (line 42) | @Override
method onDrawBefore (line 52) | @Override
method onDrawLunarBefore (line 61) | @Override
method isDraw (line 79) | @Override
method getDateType (line 84) | @Override
method getContent (line 101) | @Override
method onDraw (line 109) | @Override
method onClick (line 126) | @Override
FILE: app/src/main/java/com/palmwifi/testcal/utils/DensityUtils.java
class DensityUtils (line 9) | public class DensityUtils {
method DensityUtils (line 11) | private DensityUtils() {
method dp2px (line 27) | public static int dp2px(Context context, float dpVal)
method sp2px (line 45) | public static int sp2px(Context context, float spVal)
method px2dp (line 64) | public static float px2dp(Context context, float pxVal)
method px2sp (line 82) | public static float px2sp(Context context, float pxVal)
FILE: app/src/test/java/com/palmwifi/testcal/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
FILE: calendar/src/androidTest/java/com/bin/david/calendar/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 19) | @Test
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarAdapter.java
class CalendarAdapter (line 16) | public abstract class CalendarAdapter extends RecyclerView.Adapter<Calen...
method CalendarAdapter (line 25) | public CalendarAdapter(int mode) {
method CalendarAdapter (line 29) | public CalendarAdapter() {
method onCreateViewHolder (line 33) | @Override
method decorateCalendarView (line 48) | protected abstract void decorateCalendarView(CalendarView calendarView);
method onBindViewHolder (line 50) | @Override
method getMonthPosition (line 68) | public int getMonthPosition(CustomDate customDate){
method getWeekPosition (line 73) | public int getWeekPosition(CustomDate customDate){
method getItemCount (line 82) | @Override
class ViewHolder (line 87) | static class ViewHolder extends RecyclerView.ViewHolder {
method ViewHolder (line 89) | ViewHolder(View itemView) {
method getItemViewType (line 94) | @Override
method getMode (line 99) | public int getMode() {
method setMode (line 103) | public void setMode(int mode) {
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarMonthView.java
class CalendarMonthView (line 9) | public class CalendarMonthView extends CalendarView {
method CalendarMonthView (line 13) | public CalendarMonthView(Context context, AttributeSet attrs) {
method CalendarMonthView (line 18) | public CalendarMonthView(Context context) {
method CalendarMonthView (line 23) | public CalendarMonthView(Context context, @Nullable AttributeSet attrs...
method setShowDate (line 27) | public void setShowDate(CustomDate showDate){
method measureClickCell (line 34) | @Override
method getTotalRow (line 52) | @Override
method fillMonthDate (line 58) | private void fillMonthDate() {
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarRecyclerHelper.java
class CalendarRecyclerHelper (line 13) | public class CalendarRecyclerHelper {
method CalendarRecyclerHelper (line 15) | private CalendarRecyclerHelper(){}
method init (line 17) | public static void init(Context context, RecyclerView recyclerView, Ca...
method init (line 22) | public static void init(Context context, RecyclerView recyclerView, Ca...
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarView.java
class CalendarView (line 19) | public abstract class CalendarView extends View {
method CalendarView (line 35) | public CalendarView(Context context, AttributeSet attrs) {
method CalendarView (line 39) | public CalendarView(Context context) {
method CalendarView (line 43) | public CalendarView(Context context, @Nullable AttributeSet attrs, int...
method measureClickCell (line 51) | protected abstract void measureClickCell(int col, int row);
method onDraw (line 55) | @Override
method init (line 73) | private void init(Context context,AttributeSet attrs) {
method onMeasure (line 91) | @Override
method onSizeChanged (line 100) | @Override
method onTouchEvent (line 111) | @Override
method getCell (line 131) | public Cell getCell(int row,int col) {
class Cell (line 136) | public static class Cell {
method Cell (line 142) | Cell(CustomDate date, int row, int col) {
method update (line 149) | void update(CustomDate date,int row,int col) {
method getDate (line 155) | public CustomDate getDate() {
method getRect (line 159) | public Rect getRect(int perW, int perH){
method getShowDate (line 172) | public CustomDate getShowDate() {
method geCalendarDraw (line 176) | protected CalendarDraw geCalendarDraw() {
method addDrawFormat (line 180) | public void addDrawFormat(IDrawFormat drawFormat){
method getDrawFormats (line 184) | public List<IDrawFormat> getDrawFormats(){
method getDefaultTextColor (line 190) | public int getDefaultTextColor() {
method setDefaultTextColor (line 194) | public void setDefaultTextColor(int defaultTextColor) {
method getDefaultTextSize (line 198) | public int getDefaultTextSize() {
method setDefaultTextSize (line 202) | public void setDefaultTextSize(int defaultTextSize) {
class CalendarDraw (line 210) | public static class CalendarDraw implements IDrawFormat{
method onDraw (line 215) | @Override
method getDateType (line 223) | @Override
method onDraw (line 228) | public void onDraw(CalendarView calendarView, Canvas canvas, Cell ce...
method onClick (line 237) | public void onClick(CalendarView calendarView,Cell cell) {
method getDrawFormats (line 244) | public List<IDrawFormat> getDrawFormats() {
method getOnClickListener (line 249) | public OnClickListener getOnClickListener() {
method setOnClickListener (line 253) | public void setOnClickListener(OnClickListener onClickListener) {
type OnClickListener (line 257) | public interface OnClickListener{
method onClick (line 258) | void onClick(CalendarView calendarView,Cell cell);
type OnCalendarPageChanged (line 261) | public interface OnCalendarPageChanged{
method onPageChanged (line 263) | void onPageChanged(CustomDate showDate);
method getTotalRow (line 266) | public abstract int getTotalRow();
type IDrawFormat (line 272) | public static interface IDrawFormat {
method onDraw (line 274) | void onDraw(CalendarView calendarView);
method getDateType (line 276) | int getDateType(CalendarView calendarView, Cell cell);
method onDraw (line 278) | void onDraw(CalendarView calendarView, Canvas canvas, Cell cell, Rec...
method onClick (line 280) | void onClick(CalendarView calendarView, Cell cell);
method getTextHeight (line 284) | public static int getTextHeight(Paint paint){
method getTextCenterY (line 289) | public static float getTextCenterY(int centerY,Paint paint){
FILE: calendar/src/main/java/com/bin/david/calendar/CalendarWeekView.java
class CalendarWeekView (line 9) | public class CalendarWeekView extends CalendarView {
method CalendarWeekView (line 12) | public CalendarWeekView(Context context, AttributeSet attrs) {
method CalendarWeekView (line 17) | public CalendarWeekView(Context context) {
method CalendarWeekView (line 22) | public CalendarWeekView(Context context, @Nullable AttributeSet attrs,...
method setShowDate (line 26) | public void setShowDate(CustomDate showDate) {
method measureClickCell (line 33) | @Override
method getTotalRow (line 51) | @Override
method fillWeekDate (line 57) | private void fillWeekDate() {
FILE: calendar/src/main/java/com/bin/david/calendar/CustomDate.java
class CustomDate (line 5) | public class CustomDate implements Serializable,Comparable<CustomDate>{
method CustomDate (line 14) | public CustomDate(int year,int month,int day,int week){
method update (line 28) | public void update(int year,int month,int day,int week){
method CustomDate (line 43) | public CustomDate(int year,int month,int day){
method CustomDate (line 56) | public CustomDate(){
method isSameDay (line 65) | public boolean isSameDay(CustomDate customDate){
method isSameMonth (line 69) | public boolean isSameMonth(CustomDate customDate){
method isSameYear (line 73) | public boolean isSameYear(CustomDate customDate){
method toString (line 78) | @Override
method compareTo (line 84) | @Override
method compareDays (line 102) | public int compareDays(CustomDate another){
FILE: calendar/src/main/java/com/bin/david/calendar/DateUtil.java
class DateUtil (line 11) | public class DateUtil {
method getMonthDays (line 15) | public static int getMonthDays(int year, int month) {
method getYear (line 39) | public static int getYear() {
method getMonth (line 43) | public static int getMonth() {
method getCurrentMonthDay (line 47) | public static int getCurrentMonthDay() {
method getWeekDay (line 51) | public static int getWeekDay() {
method getHour (line 55) | public static int getHour() {
method getMinute (line 58) | public static int getMinute() {
method getWeekDayFromDate (line 65) | public static int getWeekDayFromDate(int year, int month) {
method getDateFromString (line 75) | @SuppressLint("SimpleDateFormat")
method isToday (line 88) | public static boolean isToday(CustomDate date){
method isCurrentMonth (line 94) | public static boolean isCurrentMonth(CustomDate date){
method betweenDays (line 99) | public static int betweenDays(CustomDate date, CustomDate compareDate){
FILE: calendar/src/main/java/com/bin/david/calendar/LunarCalendar.java
class LunarCalendar (line 10) | @SuppressWarnings("unused")
method getTraditionFestivalText (line 62) | private static String getTraditionFestivalText(int year, int month, in...
method numToChineseMonth (line 87) | private static String numToChineseMonth(int month) {
method numToChineseDay (line 97) | static String numToChineseDay(int day) {
method numToChinese (line 108) | private static String numToChinese(int month, int day) {
method lunarToSolar (line 158) | static int[] lunarToSolar(int year, int month, int monthDay,
method solarToLunar (line 251) | static int[] solarToLunar(int year, int month, int monthDay) {
method daysInMonth (line 309) | private static int daysInMonth(int year, int month) {
method daysInMonth (line 321) | @SuppressWarnings("all")
method daysInLunarYear (line 350) | private static int daysInLunarYear(int year) {
method daysInLunarMonth (line 370) | private static int daysInLunarMonth(int year, int month) {
method leapMonth (line 383) | private static int leapMonth(int year) {
method getSolarCalendar (line 401) | public static String getSolarCalendar(int month, int day) {
method getString (line 413) | private static String getString(int month, int day) {
method getTermString (line 430) | public static String getTermString(int solarYear, int solarMonth, int ...
method getSolarTermDay (line 447) | private static int getSolarTermDay(int solarYear, int index) {
method getSolarTermCalendar (line 458) | private static Date getSolarTermCalendar(int solarYear, int index) {
method UTC (line 476) | @SuppressWarnings("all")
method getUTCDay (line 494) | @SuppressWarnings("SynchronizeOnNonFinalField")
method makeUTCCalendar (line 504) | private static void makeUTCCalendar() {
method getTermsOffset (line 517) | @SuppressWarnings("all")
method isLeapYear (line 532) | private static boolean isLeapYear(int year) {
method getWinterSolstice (line 542) | private static int getWinterSolstice(int year) {
method getLunarText (line 556) | public static String getLunarText(int year, int month, int day) {
method getLunar (line 567) | public static String getLunar(int year, int month, int day) {
FILE: calendar/src/main/java/com/bin/david/calendar/TextDrawFormat.java
class TextDrawFormat (line 13) | public abstract class TextDrawFormat implements CalendarView.IDrawFormat {
method onClick (line 23) | @Override
method onDraw (line 29) | @Override
method onDrawBackground (line 43) | public void onDrawBackground(Canvas canvas,int type,Rect rect, Paint p...
method onDrawBefore (line 48) | public void onDrawBefore(Canvas canvas,int type,Rect rect, Paint paint){
method onDrawLunarBefore (line 53) | public void onDrawLunarBefore(Canvas canvas,int type,Rect rect,int day...
method onDrawOver (line 57) | public void onDrawOver(Canvas canvas,int type,Rect rect, Paint paint){
method isDraw (line 61) | public abstract boolean isDraw(int type);
method getContent (line 63) | public String getContent(CalendarView.Cell cell,int type){
method drawText (line 69) | private void drawText(CalendarView calendarView,Canvas canvas,int type...
method isDrawLunar (line 101) | public boolean isDrawLunar() {
method setDrawLunar (line 105) | public void setDrawLunar(boolean drawLunar) {
method getInterval (line 109) | public int getInterval() {
method setInterval (line 113) | public void setInterval(int interval) {
method onDraw (line 117) | @Override
FILE: calendar/src/test/java/com/bin/david/calendar/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
Condensed preview — 75 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (224K chars).
[
{
"path": ".gitignore",
"chars": 118,
"preview": "*.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",
"chars": 686,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"CompilerConfiguration\">\n <resourceExt"
},
{
"path": ".idea/copyright/profiles_settings.xml",
"chars": 74,
"preview": "<component name=\"CopyrightManager\">\n <settings default=\"\" />\n</component>"
},
{
"path": ".idea/gradle.xml",
"chars": 680,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"GradleSettings\">\n <option name=\"linke"
},
{
"path": ".idea/markdown-navigator/profiles_settings.xml",
"chars": 104,
"preview": "<component name=\"MarkdownNavigator.ProfileManager\">\n <settings default=\"\" pdf-export=\"\" />\n</component>"
},
{
"path": ".idea/markdown-navigator.xml",
"chars": 4167,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"MarkdownProjectSettings\">\n <PreviewSe"
},
{
"path": ".idea/misc.xml___jb_old___",
"chars": 2821,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"EntryPointsManager\">\n <entry_points v"
},
{
"path": ".idea/modules.xml",
"chars": 917,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectModuleManager\">\n <modules>\n "
},
{
"path": ".idea/runConfigurations.xml",
"chars": 564,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RunConfigurationProducerService\">\n <o"
},
{
"path": ".idea/vcs.xml",
"chars": 180,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"VcsDirectoryMappings\">\n <mapping dire"
},
{
"path": "README.md",
"chars": 662,
"preview": "CalendarView\n============\n\n\n##### 包含三个自定义View 日历仪表盘 圆盘\n---------------------------------------\n> 这是使用RecyclerView做的日历,比"
},
{
"path": "app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "app/build.gradle",
"chars": 1121,
"preview": "apply plugin: 'com.android.application'\n\nandroid {\n compileSdkVersion 25\n buildToolsVersion \"26.0.2\"\n\n aaptOpti"
},
{
"path": "app/proguard-rules.pro",
"chars": 942,
"preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in C:"
},
{
"path": "app/src/androidTest/java/com/palmwifi/testcal/ExampleInstrumentedTest.java",
"chars": 744,
"preview": "package com.palmwifi.testcal;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpo"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 930,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package="
},
{
"path": "app/src/main/java/com/palmwifi/testcal/CalendarActivity.java",
"chars": 4259,
"preview": "package com.palmwifi.testcal;\n\nimport android.os.Handler;\nimport android.support.v4.view.ViewPager;\nimport android.suppo"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/CalendarMonthActivity.java",
"chars": 1233,
"preview": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.supp"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/CalendarWeekActivity.java",
"chars": 1263,
"preview": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.supp"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/DashBoardActivity.java",
"chars": 1341,
"preview": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.supp"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/HomeActivity.java",
"chars": 1746,
"preview": "package com.palmwifi.testcal;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.annotatio"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/RingActivity.java",
"chars": 978,
"preview": "package com.palmwifi.testcal;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.supp"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarMonthView.java",
"chars": 6131,
"preview": "package com.palmwifi.testcal.calendar;\n\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\n\npublic clas"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarView.java",
"chars": 9203,
"preview": "package com.palmwifi.testcal.calendar;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.g"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewBuilder.java",
"chars": 751,
"preview": "package com.palmwifi.testcal.calendar;\n\nimport android.content.Context;\n\n\npublic class CalendarViewBuilder {\n\n\n\tpublic s"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerAdapter.java",
"chars": 1270,
"preview": "package com.palmwifi.testcal.calendar;\n\nimport android.os.Parcelable;\nimport android.support.v4.view.PagerAdapter;\nimpor"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/CalendarViewPagerListener.java",
"chars": 1818,
"preview": "package com.palmwifi.testcal.calendar;\n\n\nimport android.support.v4.view.ViewPager;\nimport android.support.v4.view.ViewPa"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/CustomDate.java",
"chars": 2396,
"preview": "package com.palmwifi.testcal.calendar;\n\nimport java.io.Serializable;\n\npublic class CustomDate implements Serializable,Co"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/DateUtil.java",
"chars": 3082,
"preview": "package com.palmwifi.testcal.calendar;\n\nimport android.annotation.SuppressLint;\n\nimport java.text.ParseException;\nimport"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/OnCalenderListener.java",
"chars": 284,
"preview": "package com.palmwifi.testcal.calendar;\n\n\npublic interface OnCalenderListener {\n\n\t void clickDate(CustomDate date);\n\n\t vo"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/calendar/RecordState.java",
"chars": 194,
"preview": "package com.palmwifi.testcal.calendar;\n\n/**\n * Created by David on 2017/4/12.\n */\npublic enum RecordState {\n //签到的\n "
},
{
"path": "app/src/main/java/com/palmwifi/testcal/dash/DashboardView.java",
"chars": 11861,
"preview": "package com.palmwifi.testcal.dash;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport androi"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/dash/RingView.java",
"chars": 11299,
"preview": "package com.palmwifi.testcal.dash;\n\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimport andro"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/newcalendar/CustomCalendarAdapter.java",
"chars": 630,
"preview": "package com.palmwifi.testcal.newcalendar;\n\n\nimport com.bin.david.calendar.CalendarAdapter;\nimport com.bin.david.calendar"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/newcalendar/CustomTextDrawFormat.java",
"chars": 4275,
"preview": "package com.palmwifi.testcal.newcalendar;\n\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimpor"
},
{
"path": "app/src/main/java/com/palmwifi/testcal/utils/DensityUtils.java",
"chars": 1406,
"preview": "package com.palmwifi.testcal.utils;\n\nimport android.content.Context;\nimport android.util.TypedValue;\n\n\n//常用单位转换的辅助类\n\npub"
},
{
"path": "app/src/main/res/layout/ac_dash_broad.xml",
"chars": 1316,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "app/src/main/res/layout/ac_home.xml",
"chars": 1301,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "app/src/main/res/layout/ac_ring.xml",
"chars": 968,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "app/src/main/res/layout/activity_calendar.xml",
"chars": 3168,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "app/src/main/res/layout/activity_main.xml",
"chars": 4302,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "app/src/main/res/values/attrs.xml",
"chars": 976,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <declare-styleable name=\"RingView\">\n <attr name=\"totalSect"
},
{
"path": "app/src/main/res/values/colors.xml",
"chars": 1031,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"colorPrimary\">#3F51B5</color>\n <color name=\"color"
},
{
"path": "app/src/main/res/values/dimens.xml",
"chars": 864,
"preview": "<resources>\n\n\n\n <!-- calendar -->\n <dimen name=\"bar_margin\">15dp</dimen>\n <dimen name=\"calendar_day_margin_top\""
},
{
"path": "app/src/main/res/values/strings.xml",
"chars": 337,
"preview": "<resources>\n <string name=\"app_name\">TestCal</string>\n <string-array name=\"mult_temp_dash\">\n <item>寒冷</item"
},
{
"path": "app/src/main/res/values/styles.xml",
"chars": 777,
"preview": "<resources>\n\n <!-- Base application theme. -->\n <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar"
},
{
"path": "app/src/test/java/com/palmwifi/testcal/ExampleUnitTest.java",
"chars": 398,
"preview": "package com.palmwifi.testcal;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
},
{
"path": "build.gradle",
"chars": 498,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n r"
},
{
"path": "calendar/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "calendar/build.gradle",
"chars": 665,
"preview": "apply plugin: 'com.android.library'\n\nandroid {\n compileSdkVersion 26\n buildToolsVersion \"26.0.2\"\n\n\n defaultConf"
},
{
"path": "calendar/proguard-rules.pro",
"chars": 751,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "calendar/src/androidTest/java/com/bin/david/calendar/ExampleInstrumentedTest.java",
"chars": 750,
"preview": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nim"
},
{
"path": "calendar/src/main/AndroidManifest.xml",
"chars": 109,
"preview": "<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",
"chars": 3420,
"preview": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport a"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/CalendarMonthView.java",
"chars": 3284,
"preview": "package com.bin.david.calendar;\n\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport and"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/CalendarRecyclerHelper.java",
"chars": 1850,
"preview": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.support.v7.widget.LinearLayoutManager;\ni"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/CalendarView.java",
"chars": 8232,
"preview": "package com.bin.david.calendar;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.g"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/CalendarWeekView.java",
"chars": 2143,
"preview": "package com.bin.david.calendar;\n\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport and"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/CustomDate.java",
"chars": 2257,
"preview": "package com.bin.david.calendar;\n\nimport java.io.Serializable;\n\npublic class CustomDate implements Serializable,Comparabl"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/DateUtil.java",
"chars": 2919,
"preview": "package com.bin.david.calendar;\n\nimport android.annotation.SuppressLint;\n\nimport java.text.ParseException;\nimport java.t"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/LunarCalendar.java",
"chars": 17889,
"preview": "package com.bin.david.calendar;\n\n\nimport android.text.TextUtils;\n\nimport java.util.Date;\nimport java.util.GregorianCalen"
},
{
"path": "calendar/src/main/java/com/bin/david/calendar/TextDrawFormat.java",
"chars": 3647,
"preview": "package com.bin.david.calendar;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics."
},
{
"path": "calendar/src/main/res/layout/item_month_calendar.xml",
"chars": 350,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.bin.david.calendar.CalendarMonthView xmlns:android=\"http://schemas.android.c"
},
{
"path": "calendar/src/main/res/layout/item_week_calendar.xml",
"chars": 349,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.bin.david.calendar.CalendarWeekView xmlns:android=\"http://schemas.android.co"
},
{
"path": "calendar/src/main/res/values/attrs.xml",
"chars": 292,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <declare-styleable name=\"CalendarView\">\n <attr name=\"baseT"
},
{
"path": "calendar/src/main/res/values/dimens.xml",
"chars": 83,
"preview": "<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",
"chars": 71,
"preview": "<resources>\n <string name=\"app_name\">calendar</string>\n</resources>\n"
},
{
"path": "calendar/src/test/java/com/bin/david/calendar/ExampleUnitTest.java",
"chars": 400,
"preview": "package com.bin.david.calendar;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit te"
},
{
"path": "gradle/wrapper/gradle-wrapper.jar",
"chars": 53418,
"preview": ", Info CBS Applicability(ComponentAnalyzerEvaluateSelfUpdate): Component: amd64_microsoft-windows-m."
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 230,
"preview": "#Wed Apr 12 10:38:55 CST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
},
{
"path": "gradle.properties",
"chars": 730,
"preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
},
{
"path": "gradlew",
"chars": 4971,
"preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n## Gradle start "
},
{
"path": "gradlew.bat",
"chars": 2314,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
},
{
"path": "settings.gradle",
"chars": 28,
"preview": "include ':app', ':calendar'\n"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the huangyanbin/CalendarView GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 75 files (202.4 KB), approximately 61.2k tokens, and a symbol index with 331 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.