├── app ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ ├── btn_ok_pre.png │ │ │ ├── ic_menu_go.png │ │ │ ├── btn_clock_pre.png │ │ │ ├── btn_menu_pre.png │ │ │ ├── btn_ok_normal.png │ │ │ ├── ic_launcher.png │ │ │ ├── btn_delete_pre.png │ │ │ ├── btn_menu_normal.png │ │ │ ├── ic_detail_clock.png │ │ │ ├── ic_detail_icon.png │ │ │ ├── ic_menu_item_go.png │ │ │ ├── btn_clock_normal.png │ │ │ ├── btn_delete_normal.png │ │ │ ├── ic_detail_category.png │ │ │ ├── ic_detail_location.png │ │ │ ├── ic_detail_remarks.png │ │ │ ├── ic_event_set_icon.png │ │ │ ├── ic_menu_category.png │ │ │ ├── ic_menu_event_set.png │ │ │ ├── ic_menu_schedule.png │ │ │ ├── ic_schedule_finish.png │ │ │ ├── ic_detail_arrow_pre.png │ │ │ ├── btn_add_event_set_pre.png │ │ │ ├── ic_add_event_set_color.png │ │ │ ├── ic_add_event_set_name.png │ │ │ ├── ic_detail_arrow_normal.png │ │ │ ├── btn_add_event_set_normal.png │ │ │ ├── ic_select_event_set_icon.png │ │ │ ├── btn_dialog_add_event_set_pre.png │ │ │ ├── ic_select_event_set_category.png │ │ │ └── btn_dialog_add_event_set_normal.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── drawable-xhdpi │ │ │ ├── bg_item_schedule.9.png │ │ │ ├── bg_bottom_input_bar.9.png │ │ │ ├── bg_remark_edit_text.9.png │ │ │ └── bg_menu_border_with_arrow.9.png │ │ ├── layout │ │ │ ├── item_schedule_bottom.xml │ │ │ ├── fragment_schedule.xml │ │ │ ├── activity_main.xml │ │ │ ├── main_container.xml │ │ │ ├── layout_drop_container.xml │ │ │ ├── fragment_event_set.xml │ │ │ ├── item_schedule_center.xml │ │ │ ├── item_select_event_set.xml │ │ │ ├── main_input.xml │ │ │ ├── item_schedule_finish.xml │ │ │ ├── item_schedule.xml │ │ │ ├── dialog_confirm.xml │ │ │ ├── item_event_set.xml │ │ │ ├── simple_title_bar.xml │ │ │ ├── main_title_bar.xml │ │ │ ├── dialog_input_location.xml │ │ │ ├── dialog_select_event_set.xml │ │ │ └── activity_add_event_set.xml │ │ ├── drawable │ │ │ ├── btn_cancel_pre.xml │ │ │ ├── btn_confirm_pre.xml │ │ │ ├── dialog_background.xml │ │ │ ├── btn_cancel_normal.xml │ │ │ ├── btn_confirm_normal.xml │ │ │ ├── menu_item_border.xml │ │ │ ├── blue_select_color_item.xml │ │ │ ├── green_select_color_item.xml │ │ │ ├── pink_select_color_item.xml │ │ │ ├── purple_select_color_item.xml │ │ │ ├── btn_ok.xml │ │ │ ├── orange_select_color_item.xml │ │ │ ├── yellow_select_color_item.xml │ │ │ ├── btn_clock.xml │ │ │ ├── btn_menu.xml │ │ │ ├── btn_show_finish_pre.xml │ │ │ ├── btn_delete.xml │ │ │ ├── btn_show_finish_normal.xml │ │ │ ├── btn_cancel.xml │ │ │ ├── btn_confirm.xml │ │ │ ├── btn_add_event_set.xml │ │ │ ├── btn_dialog_add_event_set.xml │ │ │ ├── select_color_item_border.xml │ │ │ ├── bg_select_date_dialog_edit_text.xml │ │ │ ├── blue_schedule_left_block.xml │ │ │ ├── green_schedule_left_block.xml │ │ │ ├── grey_schedule_left_block.xml │ │ │ ├── pink_schedule_left_block.xml │ │ │ ├── purple_schedule_left_block.xml │ │ │ ├── blue_circle.xml │ │ │ ├── orange_schedule_left_block.xml │ │ │ ├── pink_circle.xml │ │ │ ├── schedule_input_edit_text_focus.xml │ │ │ ├── yellow_schedule_left_block.xml │ │ │ ├── green_circle.xml │ │ │ ├── orange_circle.xml │ │ │ ├── purple_circle.xml │ │ │ ├── schedule_input_edit_text_normal.xml │ │ │ ├── yellow_circle.xml │ │ │ ├── bg_select_event_set_radio_normal.xml │ │ │ ├── btn_show_finish.xml │ │ │ ├── start_schedule_hint.xml │ │ │ ├── bg_add_event_set_item.xml │ │ │ ├── bg_select_event_set_radio.xml │ │ │ ├── schedule_input_edit_text.xml │ │ │ ├── finish_schedule_hint.xml │ │ │ ├── bg_select_date_dialog_edit_text_focus.xml │ │ │ ├── bg_select_date_dialog_edit_text_normal.xml │ │ │ └── bg_select_event_set_radio_pre.xml │ │ ├── color │ │ │ ├── simple_title_bar_text_color.xml │ │ │ ├── dialog_add_event_set_color.xml │ │ │ └── menu_item_text_color.xml │ │ ├── values-v19 │ │ │ └── styles.xml │ │ ├── values-v21 │ │ │ └── styles.xml │ │ ├── values │ │ │ ├── styles.xml │ │ │ ├── dimens.xml │ │ │ ├── attrs.xml │ │ │ ├── strings.xml │ │ │ └── colors.xml │ │ └── values-zh │ │ │ └── strings.xml │ │ ├── java │ │ └── com │ │ │ └── jeek │ │ │ └── calendar │ │ │ ├── task │ │ │ ├── schedule │ │ │ │ ├── RemoveScheduleTask.java │ │ │ │ ├── UpdateScheduleTask.java │ │ │ │ ├── LoadScheduleTask.java │ │ │ │ └── AddScheduleTask.java │ │ │ └── eventset │ │ │ │ ├── GetScheduleTask.java │ │ │ │ ├── LoadEventSetTask.java │ │ │ │ ├── LoadEventSetMapTask.java │ │ │ │ ├── RemoveEventSetTask.java │ │ │ │ └── AddEventSetTask.java │ │ │ ├── widget │ │ │ ├── StrikeThruTextView.java │ │ │ ├── AbsoluteRecyclerView.java │ │ │ └── NoSlideDrawerLayout.java │ │ │ ├── utils │ │ │ ├── DateUtils.java │ │ │ └── JeekUtils.java │ │ │ ├── dialog │ │ │ ├── InputLocationDialog.java │ │ │ ├── ConfirmDialog.java │ │ │ ├── SelectColorDialog.java │ │ │ └── SelectEventSetDialog.java │ │ │ ├── adapter │ │ │ ├── SelectEventSetAdapter.java │ │ │ └── EventSetAdapter.java │ │ │ └── activity │ │ │ └── AddEventSetActivity.java │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── common ├── .gitignore ├── src │ └── main │ │ ├── res │ │ └── values │ │ │ └── styles.xml │ │ ├── java │ │ └── com │ │ │ └── jimmy │ │ │ └── common │ │ │ ├── listener │ │ │ └── OnTaskFinishedListener.java │ │ │ ├── util │ │ │ ├── DensityUtils.java │ │ │ ├── StringUtils.java │ │ │ ├── DeviceUtils.java │ │ │ └── ToastUtils.java │ │ │ ├── base │ │ │ ├── task │ │ │ │ └── BaseAsyncTask.java │ │ │ └── app │ │ │ │ ├── BaseActivity.java │ │ │ │ └── BaseFragment.java │ │ │ ├── data │ │ │ ├── JeekSQLiteHelper.java │ │ │ ├── JeekDBConfig.java │ │ │ └── EventSetDao.java │ │ │ └── bean │ │ │ ├── EventSet.java │ │ │ └── Schedule.java │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── calendar ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── mipmap-xhdpi │ │ │ ├── bg_no_task.png │ │ │ ├── ic_rest_day.png │ │ │ └── ic_work_day.png │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ ├── dimens.xml │ │ │ └── attrs.xml │ │ ├── values-zh │ │ │ └── strings.xml │ │ └── layout │ │ │ └── layout_schedule.xml │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── jeek │ │ │ └── calendar │ │ │ └── widget │ │ │ └── calendar │ │ │ ├── schedule │ │ │ ├── ScheduleState.java │ │ │ ├── OnScheduleScrollListener.java │ │ │ ├── AutoMoveAnimation.java │ │ │ ├── ScheduleAnimation.java │ │ │ └── ScheduleRecyclerView.java │ │ │ ├── week │ │ │ ├── OnWeekClickListener.java │ │ │ ├── WeekAdapter.java │ │ │ └── WeekCalendarView.java │ │ │ ├── OnCalendarClickListener.java │ │ │ ├── month │ │ │ ├── OnMonthClickListener.java │ │ │ ├── MonthAdapter.java │ │ │ └── MonthCalendarView.java │ │ │ └── WeekBarView.java │ │ └── assets │ │ └── holiday.json ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── raw ├── jeek_image_1.gif └── jeek_image_2.png ├── .idea ├── copyright │ └── profiles_settings.xml ├── markdown-navigator │ └── profiles_settings.xml ├── vcs.xml ├── encodings.xml ├── markdown-exported-files.xml ├── inspectionProfiles │ ├── profiles_settings.xml │ └── Project_Default.xml ├── modules.xml ├── runConfigurations.xml ├── compiler.xml ├── gradle.xml ├── misc.xml └── markdown-navigator.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties ├── README.md └── gradlew.bat /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /common/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /calendar/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':common', ':calendar' 2 | -------------------------------------------------------------------------------- /common/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /raw/jeek_image_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/raw/jeek_image_1.gif -------------------------------------------------------------------------------- /raw/jeek_image_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/raw/jeek_image_2.png -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_ok_pre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_ok_pre.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_menu_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_menu_go.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_clock_pre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_clock_pre.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_menu_pre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_menu_pre.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_ok_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_ok_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_delete_pre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_delete_pre.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_menu_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_menu_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_detail_clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_detail_clock.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_detail_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_detail_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_menu_item_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_menu_item_go.png -------------------------------------------------------------------------------- /calendar/src/main/res/mipmap-xhdpi/bg_no_task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/calendar/src/main/res/mipmap-xhdpi/bg_no_task.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_clock_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_clock_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_delete_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_delete_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_detail_category.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_detail_category.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_detail_location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_detail_location.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_detail_remarks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_detail_remarks.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_event_set_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_event_set_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_menu_category.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_menu_category.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_menu_event_set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_menu_event_set.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_menu_schedule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_menu_schedule.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_schedule_finish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_schedule_finish.png -------------------------------------------------------------------------------- /calendar/src/main/res/mipmap-xhdpi/ic_rest_day.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/calendar/src/main/res/mipmap-xhdpi/ic_rest_day.png -------------------------------------------------------------------------------- /calendar/src/main/res/mipmap-xhdpi/ic_work_day.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/calendar/src/main/res/mipmap-xhdpi/ic_work_day.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_item_schedule.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/drawable-xhdpi/bg_item_schedule.9.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_detail_arrow_pre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_detail_arrow_pre.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_bottom_input_bar.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/drawable-xhdpi/bg_bottom_input_bar.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_remark_edit_text.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/drawable-xhdpi/bg_remark_edit_text.9.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_add_event_set_pre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_add_event_set_pre.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_add_event_set_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_add_event_set_color.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_add_event_set_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_add_event_set_name.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_detail_arrow_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_detail_arrow_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_add_event_set_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_add_event_set_normal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_select_event_set_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_select_event_set_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_dialog_add_event_set_pre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_dialog_add_event_set_pre.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_select_event_set_category.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/ic_select_event_set_category.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_menu_border_with_arrow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/drawable-xhdpi/bg_menu_border_with_arrow.9.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/btn_dialog_add_event_set_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xiaojianglaile/Calendar/HEAD/app/src/main/res/mipmap-xhdpi/btn_dialog_add_event_set_normal.png -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/markdown-exported-files.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /calendar/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/listener/OnTaskFinishedListener.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.listener; 2 | 3 | /** 4 | * Created by Jimmy on 2016/8/24 0024. 5 | */ 6 | public interface OnTaskFinishedListener { 7 | void onTaskFinished(T data); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_schedule_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/schedule/ScheduleState.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.schedule; 2 | 3 | /** 4 | * Created by Jimmy on 2016/10/8 0008. 5 | */ 6 | public enum ScheduleState { 7 | OPEN, 8 | CLOSE 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_cancel_pre.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_confirm_pre.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_cancel_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_confirm_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/menu_item_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Mar 28 17:49:23 CST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/blue_select_color_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/green_select_color_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pink_select_color_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/purple_select_color_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_ok.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/orange_select_color_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/yellow_select_color_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/week/OnWeekClickListener.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.week; 2 | 3 | /** 4 | * Created by Jimmy on 2016/10/7 0007. 5 | */ 6 | public interface OnWeekClickListener { 7 | void onClickDate(int year, int month, int day); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_clock.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_show_finish_pre.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /common/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_show_finish_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/simple_title_bar_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_cancel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_confirm.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/dialog_add_event_set_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/menu_item_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_add_event_set.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_dialog_add_event_set.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /calendar/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #FFFFFF 5 | #9082BD 6 | #FF8594 7 | #F0F1F5 8 | 9 | 10 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/OnCalendarClickListener.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar; 2 | 3 | /** 4 | * Created by Jimmy on 2016/10/7 0007. 5 | */ 6 | public interface OnCalendarClickListener { 7 | void onClickDate(int year, int month, int day); 8 | void onPageChange(int year, int month, int day); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/select_color_item_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /calendar/src/main/res/values-zh/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_select_date_dialog_edit_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/blue_schedule_left_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/green_schedule_left_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/grey_schedule_left_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pink_schedule_left_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/purple_schedule_left_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/blue_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/orange_schedule_left_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pink_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/schedule_input_edit_text_focus.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/yellow_schedule_left_block.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/green_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/orange_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/purple_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/schedule_input_edit_text_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/yellow_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /calendar/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Sun 5 | Mon 6 | Tues 7 | Wed 8 | Thur 9 | Fri 10 | Sat 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_select_event_set_radio_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /calendar/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 36dp 4 | 48dp 5 | 288dp 6 | 5dp 7 | 15dp 8 | 13 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_show_finish.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/start_schedule_hint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_add_event_set_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/month/OnMonthClickListener.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.month; 2 | 3 | /** 4 | * Created by Jimmy on 2016/10/6 0006. 5 | */ 6 | public interface OnMonthClickListener { 7 | void onClickThisMonth(int year, int month, int day); 8 | void onClickLastMonth(int year, int month, int day); 9 | void onClickNextMonth(int year, int month, int day); 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_schedule.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_select_event_set_radio.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/schedule_input_edit_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/finish_schedule_hint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/util/DensityUtils.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.util; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by Jimmy on 2016/10/8 0008. 7 | */ 8 | 9 | public class DensityUtils { 10 | 11 | public static int dipToSp(Context context, float f) { 12 | return (int) ((context.getResources().getDisplayMetrics().density * f) + 0.5f); 13 | } 14 | 15 | public static int spToDip(Context context, float f) { 16 | return (int) ((context.getResources().getDisplayMetrics().scaledDensity * f) + 0.5f); 17 | } 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/res/values-v19/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # 通用的忽略文件设置(http://stackoverflow.com/questions/16736856/what-should-be-in-my-gitignore-for-an-android-studio-project) 2 | # built application files 3 | *.apk 4 | *.ap_ 5 | 6 | # files for the dex VM 7 | *.dex 8 | 9 | # generated files 10 | bin/ 11 | gen/ 12 | 13 | # Ignore gradle files 14 | .gradle/ 15 | build/ 16 | 17 | # Local configuration file (sdk path, etc) 18 | local.properties 19 | 20 | # Mac OS X clutter 21 | *.DS_Store 22 | 23 | # Android Studio 24 | *.iml 25 | 26 | # Intellij IDEA (see https://intellij-support.jetbrains.com/entries/23393067) 27 | /.idea/workspace.xml 28 | /.idea/libraries 29 | 30 | # other setting 31 | /captures 32 | *.keystore 33 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\SDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /calendar/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\SDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /common/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | 5 | compileSdkVersion compile_sdk_version 6 | buildToolsVersion build_tools_version 7 | defaultConfig { 8 | applicationId "com.jym.calendar" 9 | minSdkVersion min_sdk_version 10 | targetSdkVersion target_sdk_version 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | 22 | } 23 | 24 | dependencies { 25 | compile fileTree(include: ['*.jar'], dir: 'libs') 26 | compile project(':calendar') 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/main_container.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 11 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_select_date_dialog_edit_text_focus.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_select_date_dialog_edit_text_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /calendar/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | 5 | compileSdkVersion compile_sdk_version 6 | buildToolsVersion build_tools_version 7 | defaultConfig { 8 | minSdkVersion min_sdk_version 9 | targetSdkVersion target_sdk_version 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(include: ['*.jar'], dir: 'libs') 24 | compile project(':common') 25 | compile 'com.google.code.gson:gson:2.7' 26 | compile 'joda-time:joda-time:2.9.4' 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/util/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.util; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * Created by Jimmy on 2016/8/27 0027. 7 | */ 8 | public class StringUtils { 9 | 10 | /** 11 | * 获取随机字符串 12 | * 13 | * @param length 字符串长度 14 | * @return 15 | */ 16 | public static String getRandomString(int length) { 17 | String base = "abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ"; 18 | Random random = new Random(); 19 | StringBuffer sb = new StringBuffer(); 20 | for (int i = 0; i < length; i++) { 21 | int number = random.nextInt(base.length()); 22 | sb.append(base.charAt(number)); 23 | } 24 | return sb.toString(); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /common/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | 5 | compileSdkVersion compile_sdk_version 6 | buildToolsVersion build_tools_version 7 | defaultConfig { 8 | minSdkVersion min_sdk_version 9 | targetSdkVersion target_sdk_version 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(include: ['*.jar'], dir: 'libs') 24 | compile "com.android.support:appcompat-v7:${support_library_version}" 25 | compile "com.android.support:design:${support_library_version}" 26 | compile "com.android.support:support-v4:${support_library_version}" 27 | } 28 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/util/DeviceUtils.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.util; 2 | 3 | import android.content.Context; 4 | import android.view.inputmethod.InputMethodManager; 5 | import android.widget.EditText; 6 | 7 | /** 8 | * Created by Jimmy on 2016/10/11 0011. 9 | */ 10 | public class DeviceUtils { 11 | 12 | public static void closeSoftInput(Context context, EditText editText) { 13 | InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 14 | imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 15 | } 16 | 17 | public static void openSoftInput(Context context, EditText editText) { 18 | InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 19 | imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/schedule/RemoveScheduleTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.schedule; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.data.ScheduleDao; 6 | import com.jimmy.common.base.task.BaseAsyncTask; 7 | import com.jimmy.common.listener.OnTaskFinishedListener; 8 | 9 | /** 10 | * Created by Jimmy on 2016/10/11 0011. 11 | */ 12 | public class RemoveScheduleTask extends BaseAsyncTask { 13 | 14 | private long mId; 15 | 16 | public RemoveScheduleTask(Context context, OnTaskFinishedListener onTaskFinishedListener, long id) { 17 | super(context, onTaskFinishedListener); 18 | mId = id; 19 | } 20 | 21 | @Override 22 | protected Boolean doInBackground(Void... params) { 23 | ScheduleDao dao = ScheduleDao.getInstance(mContext); 24 | return dao.removeSchedule(mId); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/schedule/OnScheduleScrollListener.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.schedule; 2 | 3 | import android.view.GestureDetector; 4 | import android.view.MotionEvent; 5 | 6 | /** 7 | * Created by Jimmy on 2016/10/7 0007. 8 | */ 9 | public class OnScheduleScrollListener extends GestureDetector.SimpleOnGestureListener { 10 | 11 | private ScheduleLayout mScheduleLayout; 12 | 13 | public OnScheduleScrollListener(ScheduleLayout scheduleLayout) { 14 | mScheduleLayout = scheduleLayout; 15 | } 16 | 17 | @Override 18 | public boolean onDown(MotionEvent e) { 19 | return true; 20 | } 21 | 22 | @Override 23 | public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 24 | mScheduleLayout.onCalendarScroll(distanceY); 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_select_event_set_radio_pre.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 14 | 16 | 17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/eventset/GetScheduleTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.eventset; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.bean.Schedule; 6 | import com.jimmy.common.data.ScheduleDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * Created by Jimmy on 2016/10/13 0013. 14 | */ 15 | public class GetScheduleTask extends BaseAsyncTask> { 16 | 17 | private int mId; 18 | 19 | public GetScheduleTask(Context context, OnTaskFinishedListener> onTaskFinishedListener, int id) { 20 | super(context, onTaskFinishedListener); 21 | mId = id; 22 | } 23 | 24 | @Override 25 | protected List doInBackground(Void... params) { 26 | ScheduleDao dao = ScheduleDao.getInstance(mContext); 27 | return dao.getScheduleByEventSetId(mId); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/eventset/LoadEventSetTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.eventset; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.bean.EventSet; 6 | import com.jimmy.common.data.EventSetDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * Created by Jimmy on 2016/10/11 0011. 14 | */ 15 | public class LoadEventSetTask extends BaseAsyncTask> { 16 | 17 | private Context mContext; 18 | 19 | public LoadEventSetTask(Context context, OnTaskFinishedListener> onTaskFinishedListener) { 20 | super(context, onTaskFinishedListener); 21 | mContext = context; 22 | } 23 | 24 | @Override 25 | protected List doInBackground(Void... params) { 26 | EventSetDao dao = EventSetDao.getInstance(mContext); 27 | return dao.getAllEventSet(); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/eventset/LoadEventSetMapTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.eventset; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.bean.EventSet; 6 | import com.jimmy.common.data.EventSetDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | import java.util.Map; 11 | 12 | /** 13 | * Created by Jimmy on 2016/10/11 0011. 14 | */ 15 | public class LoadEventSetMapTask extends BaseAsyncTask> { 16 | 17 | private Context mContext; 18 | 19 | public LoadEventSetMapTask(Context context, OnTaskFinishedListener> onTaskFinishedListener) { 20 | super(context, onTaskFinishedListener); 21 | mContext = context; 22 | } 23 | 24 | @Override 25 | protected Map doInBackground(Void... params) { 26 | EventSetDao dao = EventSetDao.getInstance(mContext); 27 | return dao.getAllEventSetMap(); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/widget/StrikeThruTextView.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget; 2 | 3 | import android.content.Context; 4 | import android.graphics.Paint; 5 | import android.text.TextPaint; 6 | import android.util.AttributeSet; 7 | import android.widget.TextView; 8 | 9 | /** 10 | * Created by Jimmy on 2016/10/13 0013. 11 | */ 12 | public class StrikeThruTextView extends TextView { 13 | 14 | public StrikeThruTextView(Context context) { 15 | this(context, null); 16 | } 17 | 18 | public StrikeThruTextView(Context context, AttributeSet attrs) { 19 | this(context, attrs, 0); 20 | } 21 | 22 | public StrikeThruTextView(Context context, AttributeSet attrs, int defStyleAttr) { 23 | super(context, attrs, defStyleAttr); 24 | initPaint(); 25 | } 26 | 27 | private void initPaint() { 28 | TextPaint paint = getPaint(); 29 | paint.setAntiAlias(true); 30 | paint.setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/base/task/BaseAsyncTask.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.base.task; 2 | 3 | import android.content.Context; 4 | import android.os.AsyncTask; 5 | 6 | import com.jimmy.common.listener.OnTaskFinishedListener; 7 | 8 | /** 9 | * Created by Jimmy on 2016/8/24 0024. 10 | */ 11 | public abstract class BaseAsyncTask extends AsyncTask { 12 | 13 | protected Context mContext; 14 | protected OnTaskFinishedListener mOnTaskFinishedListener; 15 | 16 | public BaseAsyncTask(Context context, OnTaskFinishedListener onTaskFinishedListener) { 17 | mContext = context; 18 | mOnTaskFinishedListener = onTaskFinishedListener; 19 | } 20 | 21 | @Override 22 | protected abstract T doInBackground(Void... params); 23 | 24 | @Override 25 | protected void onPostExecute(T data) { 26 | super.onPostExecute(data); 27 | if (mOnTaskFinishedListener != null) { 28 | mOnTaskFinishedListener.onTaskFinished(data); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/eventset/RemoveEventSetTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.eventset; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.data.EventSetDao; 6 | import com.jimmy.common.data.ScheduleDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | /** 11 | * Created by Jimmy on 2016/10/11 0011. 12 | */ 13 | public class RemoveEventSetTask extends BaseAsyncTask { 14 | 15 | private int mId; 16 | 17 | public RemoveEventSetTask(Context context, OnTaskFinishedListener onTaskFinishedListener, int id) { 18 | super(context, onTaskFinishedListener); 19 | mId = id; 20 | } 21 | 22 | @Override 23 | protected Boolean doInBackground(Void... params) { 24 | ScheduleDao scheduleDao = ScheduleDao.getInstance(mContext); 25 | scheduleDao.removeScheduleByEventSetId(mId); 26 | EventSetDao dao = EventSetDao.getInstance(mContext); 27 | return dao.removeEventSet(mId); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/schedule/AutoMoveAnimation.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.schedule; 2 | 3 | import android.view.View; 4 | import android.view.animation.Animation; 5 | import android.view.animation.DecelerateInterpolator; 6 | import android.view.animation.Transformation; 7 | 8 | /** 9 | * Created by Jimmy on 2017/4/7 0007. 10 | */ 11 | public class AutoMoveAnimation extends Animation { 12 | 13 | private View mView; 14 | private int mDistance; 15 | private float mPositionY; 16 | 17 | public AutoMoveAnimation(View view, int distance) { 18 | mView = view; 19 | mDistance = distance; 20 | setDuration(200); 21 | setInterpolator(new DecelerateInterpolator(1.5f)); 22 | mPositionY = mView.getY(); 23 | } 24 | 25 | @Override 26 | protected void applyTransformation(float interpolatedTime, Transformation t) { 27 | super.applyTransformation(interpolatedTime, t); 28 | mView.setY(mPositionY + interpolatedTime * mDistance); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/data/JeekSQLiteHelper.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.data; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import android.database.sqlite.SQLiteOpenHelper; 6 | 7 | /** 8 | * Created by Jimmy on 2016/10/11 0011. 9 | */ 10 | public class JeekSQLiteHelper extends SQLiteOpenHelper { 11 | 12 | public JeekSQLiteHelper(Context context) { 13 | super(context, JeekDBConfig.DATABASE_NAME, null, JeekDBConfig.DATABASE_VERSION); 14 | } 15 | 16 | @Override 17 | public void onCreate(SQLiteDatabase db) { 18 | db.execSQL(JeekDBConfig.CREATE_EVENT_SET_TABLE_SQL); 19 | db.execSQL(JeekDBConfig.CREATE_SCHEDULE_TABLE_SQL); 20 | } 21 | 22 | @Override 23 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 24 | if (oldVersion != newVersion) { 25 | db.execSQL(JeekDBConfig.DROP_EVENT_SET_TABLE_SQL); 26 | db.execSQL(JeekDBConfig.DROP_SCHEDULE_TABLE_SQL); 27 | onCreate(db); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/schedule/UpdateScheduleTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.schedule; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.bean.Schedule; 6 | import com.jimmy.common.data.ScheduleDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | /** 11 | * Created by Jimmy on 2016/10/11 0011. 12 | */ 13 | public class UpdateScheduleTask extends BaseAsyncTask { 14 | 15 | private Schedule mSchedule; 16 | 17 | public UpdateScheduleTask(Context context, OnTaskFinishedListener onTaskFinishedListener, Schedule schedule) { 18 | super(context, onTaskFinishedListener); 19 | mSchedule = schedule; 20 | } 21 | 22 | @Override 23 | protected Boolean doInBackground(Void... params) { 24 | if (mSchedule != null) { 25 | ScheduleDao dao = ScheduleDao.getInstance(mContext); 26 | return dao.updateSchedule(mSchedule); 27 | } else { 28 | return false; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/schedule/LoadScheduleTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.schedule; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.bean.Schedule; 6 | import com.jimmy.common.data.ScheduleDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * Created by Jimmy on 2016/10/11 0011. 14 | */ 15 | public class LoadScheduleTask extends BaseAsyncTask> { 16 | 17 | private int mYear; 18 | private int mMonth; 19 | private int mDay; 20 | 21 | public LoadScheduleTask(Context context, OnTaskFinishedListener> onTaskFinishedListener, int year, int month, int day) { 22 | super(context, onTaskFinishedListener); 23 | mYear = year; 24 | mMonth = month; 25 | mDay = day; 26 | } 27 | 28 | @Override 29 | protected List doInBackground(Void... params) { 30 | ScheduleDao dao = ScheduleDao.getInstance(mContext); 31 | return dao.getScheduleByDate(mYear, mMonth,mDay); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 21 | 22 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/bean/EventSet.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by Jimmy on 2016/10/11 0011. 7 | */ 8 | public class EventSet implements Serializable { 9 | 10 | private int id; 11 | private String name; 12 | private int color; 13 | private int icon; 14 | private boolean isChecked; 15 | 16 | public int getId() { 17 | return id; 18 | } 19 | 20 | public void setId(int id) { 21 | this.id = id; 22 | } 23 | 24 | public String getName() { 25 | return name; 26 | } 27 | 28 | public void setName(String name) { 29 | this.name = name; 30 | } 31 | 32 | public int getColor() { 33 | return color; 34 | } 35 | 36 | public void setColor(int color) { 37 | this.color = color; 38 | } 39 | 40 | public int getIcon() { 41 | return icon; 42 | } 43 | 44 | public void setIcon(int icon) { 45 | this.icon = icon; 46 | } 47 | 48 | public boolean isChecked() { 49 | return isChecked; 50 | } 51 | 52 | public void setChecked(boolean checked) { 53 | isChecked = checked; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/schedule/ScheduleAnimation.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.schedule; 2 | 3 | import android.view.animation.Animation; 4 | import android.view.animation.DecelerateInterpolator; 5 | import android.view.animation.Transformation; 6 | 7 | /** 8 | * Created by Jimmy on 2016/10/8 0008. 9 | */ 10 | public class ScheduleAnimation extends Animation { 11 | 12 | private ScheduleLayout mScheduleLayout; 13 | private ScheduleState mState; 14 | private float mDistanceY; 15 | 16 | public ScheduleAnimation(ScheduleLayout scheduleLayout, ScheduleState state, float distanceY) { 17 | mScheduleLayout = scheduleLayout; 18 | mState = state; 19 | mDistanceY = distanceY; 20 | setDuration(300); 21 | setInterpolator(new DecelerateInterpolator(1.5f)); 22 | } 23 | 24 | @Override 25 | protected void applyTransformation(float interpolatedTime, Transformation t) { 26 | super.applyTransformation(interpolatedTime, t); 27 | if (mState == ScheduleState.OPEN) { 28 | mScheduleLayout.onCalendarScroll(mDistanceY); 29 | } else { 30 | mScheduleLayout.onCalendarScroll(-mDistanceY); 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/eventset/AddEventSetTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.eventset; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.bean.EventSet; 6 | import com.jimmy.common.data.EventSetDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | /** 11 | * Created by Jimmy on 2016/10/11 0011. 12 | */ 13 | public class AddEventSetTask extends BaseAsyncTask { 14 | 15 | private EventSet mEventSet; 16 | 17 | public AddEventSetTask(Context context, OnTaskFinishedListener onTaskFinishedListener, EventSet eventSet) { 18 | super(context, onTaskFinishedListener); 19 | mEventSet = eventSet; 20 | } 21 | 22 | @Override 23 | protected EventSet doInBackground(Void... params) { 24 | if (mEventSet != null) { 25 | EventSetDao dao = EventSetDao.getInstance(mContext); 26 | int id = dao.addEventSet(mEventSet); 27 | if (id != 0) { 28 | mEventSet.setId(id); 29 | return mEventSet; 30 | } else { 31 | return null; 32 | } 33 | } else { 34 | return null; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/task/schedule/AddScheduleTask.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.task.schedule; 2 | 3 | import android.content.Context; 4 | 5 | import com.jimmy.common.bean.Schedule; 6 | import com.jimmy.common.data.ScheduleDao; 7 | import com.jimmy.common.base.task.BaseAsyncTask; 8 | import com.jimmy.common.listener.OnTaskFinishedListener; 9 | 10 | /** 11 | * Created by Jimmy on 2016/10/11 0011. 12 | */ 13 | public class AddScheduleTask extends BaseAsyncTask { 14 | 15 | private Schedule mSchedule; 16 | 17 | public AddScheduleTask(Context context, OnTaskFinishedListener onTaskFinishedListener, Schedule schedule) { 18 | super(context, onTaskFinishedListener); 19 | mSchedule = schedule; 20 | } 21 | 22 | @Override 23 | protected Schedule doInBackground(Void... params) { 24 | if (mSchedule != null) { 25 | ScheduleDao dao = ScheduleDao.getInstance(mContext); 26 | int id = dao.addSchedule(mSchedule); 27 | if (id != 0) { 28 | mSchedule.setId(id); 29 | return mSchedule; 30 | } else { 31 | return null; 32 | } 33 | } else { 34 | return null; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/utils/DateUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.utils; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | 6 | /** 7 | * Created by Jimmy on 2016/10/14 0014. 8 | */ 9 | public class DateUtils { 10 | 11 | /** 12 | * 时间戳转换成日期格式字符串 13 | * 14 | * @param time 时间戳 15 | * @param format 16 | * @return 17 | */ 18 | public static String timeStamp2Date(long time, String format) { 19 | if (time == 0) { 20 | return ""; 21 | } 22 | if (format == null || format.isEmpty()) { 23 | format = "yyyy-MM-dd HH:mm:ss"; 24 | } 25 | SimpleDateFormat sdf = new SimpleDateFormat(format); 26 | return sdf.format(new Date(time)); 27 | } 28 | 29 | /** 30 | * 日期格式字符串转换成时间戳 31 | * 32 | * @param date 字符串日期 33 | * @param format 如:yyyy-MM-dd HH:mm:ss 34 | * @return 35 | */ 36 | public static long date2TimeStamp(String date, String format) { 37 | try { 38 | SimpleDateFormat sdf = new SimpleDateFormat(format); 39 | return sdf.parse(date).getTime(); 40 | } catch (Exception e) { 41 | e.printStackTrace(); 42 | } 43 | return 0; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /calendar/src/main/assets/holiday.json: -------------------------------------------------------------------------------- 1 | { 2 | "201612":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0], 3 | "20171":[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,1,1,1,1,1,1,0,2,0,0,0,0,0,0,0], 4 | "20172":[1,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 5 | "20173":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,0,0,0,0], 6 | "20174":[0,0,0,0,0,0,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0], 7 | "20175":[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0], 8 | "20176":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 9 | "20177":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 10 | "20178":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 11 | "20179":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,1,1], 12 | "201710":[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 13 | "201711":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 14 | "201712":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0] 15 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_drop_container.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 18 | 19 | 24 | 25 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/schedule/ScheduleRecyclerView.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.schedule; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | 9 | /** 10 | * Created by Jimmy on 2016/10/8 0008. 11 | */ 12 | public class ScheduleRecyclerView extends RecyclerView { 13 | 14 | public ScheduleRecyclerView(Context context) { 15 | this(context, null); 16 | } 17 | 18 | public ScheduleRecyclerView(Context context, @Nullable AttributeSet attrs) { 19 | this(context, attrs, 0); 20 | } 21 | 22 | public ScheduleRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 23 | super(context, attrs, defStyle); 24 | } 25 | 26 | public boolean isScrollTop() { 27 | return computeVerticalScrollOffset() == 0; 28 | } 29 | 30 | public void requestChildFocus(View child, View focused) { 31 | super.requestChildFocus(child, focused); 32 | if (getOnFocusChangeListener() != null) { 33 | getOnFocusChangeListener().onFocusChange(child, false); 34 | getOnFocusChangeListener().onFocusChange(focused, true); 35 | } 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_event_set.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 17 | 18 | 23 | 24 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/base/app/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.base.app; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | /** 9 | * Created by Jimmy on 2016/7/31. 10 | */ 11 | public abstract class BaseActivity extends AppCompatActivity { 12 | 13 | @Override 14 | protected void onCreate(@Nullable Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | bindView(); 17 | initData(); 18 | } 19 | 20 | @Override 21 | protected void onResume() { 22 | super.onResume(); 23 | bindData(); 24 | } 25 | 26 | @Override 27 | protected void onStop() { 28 | super.onStop(); 29 | } 30 | 31 | @Override 32 | protected void onDestroy() { 33 | super.onDestroy(); 34 | } 35 | 36 | protected abstract void bindView(); 37 | 38 | /** 39 | * 请求动态数据 40 | */ 41 | protected void initData() { 42 | 43 | } 44 | 45 | /** 46 | * 绑定静态数据 47 | */ 48 | protected void bindData() { 49 | 50 | } 51 | 52 | protected VT searchViewById(int id) { 53 | VT view = (VT) findViewById(id); 54 | if (view == null) 55 | throw new NullPointerException("This resource id is invalid."); 56 | return view; 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/widget/AbsoluteRecyclerView.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.util.AttributeSet; 7 | import android.view.MotionEvent; 8 | 9 | /** 10 | * Created by Jimmy on 2016/10/12 0012. 11 | */ 12 | public class AbsoluteRecyclerView extends RecyclerView { 13 | 14 | public AbsoluteRecyclerView(Context context) { 15 | super(context); 16 | setFocusable(false); 17 | } 18 | 19 | public AbsoluteRecyclerView(Context context, @Nullable AttributeSet attrs) { 20 | super(context, attrs); 21 | setFocusable(false); 22 | } 23 | 24 | public AbsoluteRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 25 | super(context, attrs, defStyle); 26 | setFocusable(false); 27 | } 28 | 29 | @Override 30 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 31 | int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); 32 | super.onMeasure(widthMeasureSpec, expandSpec); 33 | } 34 | 35 | @Override 36 | public boolean onTouchEvent(MotionEvent e) { 37 | return true; 38 | } 39 | 40 | @Override 41 | public boolean onInterceptTouchEvent(MotionEvent e) { 42 | return false; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/widget/NoSlideDrawerLayout.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget; 2 | 3 | import android.content.Context; 4 | import android.support.v4.widget.DrawerLayout; 5 | import android.util.AttributeSet; 6 | import android.view.MotionEvent; 7 | import android.view.View; 8 | 9 | /** 10 | * Created by Jimmy on 2016/10/12 0012. 11 | */ 12 | public class NoSlideDrawerLayout extends DrawerLayout { 13 | 14 | private View vMenu; 15 | private boolean mCanMove; 16 | 17 | public NoSlideDrawerLayout(Context context) { 18 | super(context); 19 | } 20 | 21 | public NoSlideDrawerLayout(Context context, AttributeSet attrs) { 22 | super(context, attrs); 23 | } 24 | 25 | public NoSlideDrawerLayout(Context context, AttributeSet attrs, int defStyle) { 26 | super(context, attrs, defStyle); 27 | } 28 | 29 | @Override 30 | protected void onFinishInflate() { 31 | super.onFinishInflate(); 32 | vMenu = findViewWithTag("menu"); 33 | } 34 | 35 | @Override 36 | public boolean onInterceptTouchEvent(MotionEvent ev) { 37 | if (ev.getAction() == MotionEvent.ACTION_DOWN) { 38 | int width = vMenu.getWidth(); 39 | mCanMove = ev.getX() >= width || ev.getX() < 15; 40 | } 41 | try { 42 | return mCanMove && super.onInterceptTouchEvent(ev); 43 | } catch (Exception e) { 44 | return false; 45 | } 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_schedule_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 22 | 23 | 32 | 33 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/util/ToastUtils.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.util; 2 | 3 | import android.content.Context; 4 | import android.widget.Toast; 5 | 6 | /** 7 | * Created by Jimmy on 2016/8/30 0030. 8 | */ 9 | public class ToastUtils { 10 | 11 | private static Toast mToast; 12 | 13 | public static void showShortToast(Context context, String text) { 14 | if (mToast != null) mToast.cancel(); 15 | mToast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 16 | mToast.show(); 17 | } 18 | 19 | public static void showShortToast(Context context, int resId) { 20 | if (mToast != null) mToast.cancel(); 21 | mToast = Toast.makeText(context, resId, Toast.LENGTH_SHORT); 22 | mToast.show(); 23 | } 24 | 25 | public static void showLongToast(Context context, String text) { 26 | if (mToast != null) mToast.cancel(); 27 | mToast = Toast.makeText(context, text, Toast.LENGTH_LONG); 28 | mToast.show(); 29 | } 30 | 31 | public static void showLongToast(Context context, int resId) { 32 | if (mToast != null) mToast.cancel(); 33 | mToast = Toast.makeText(context, resId, Toast.LENGTH_SHORT); 34 | mToast.show(); 35 | } 36 | 37 | public static void showToast(Context context, String text) { 38 | Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); 39 | } 40 | 41 | public static void showToast(Context context, int resId) { 42 | Toast.makeText(context, resId, Toast.LENGTH_SHORT).show(); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_select_event_set.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 28 | 29 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/dialog/InputLocationDialog.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.dialog; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.view.View; 6 | import android.widget.EditText; 7 | 8 | import com.jeek.calendar.R; 9 | 10 | /** 11 | * Created by Jimmy on 2016/10/15 0015. 12 | */ 13 | public class InputLocationDialog extends Dialog implements View.OnClickListener { 14 | 15 | private OnLocationBackListener mOnLocationBackListener; 16 | private EditText etLocationContent; 17 | 18 | public InputLocationDialog(Context context, OnLocationBackListener onLocationBackListener) { 19 | super(context, R.style.DialogFullScreen); 20 | mOnLocationBackListener = onLocationBackListener; 21 | initView(); 22 | } 23 | 24 | private void initView() { 25 | setContentView(R.layout.dialog_input_location); 26 | etLocationContent = (EditText) findViewById(R.id.etLocationContent); 27 | findViewById(R.id.tvCancel).setOnClickListener(this); 28 | findViewById(R.id.tvConfirm).setOnClickListener(this); 29 | } 30 | 31 | @Override 32 | public void onClick(View v) { 33 | switch (v.getId()) { 34 | case R.id.tvCancel: 35 | dismiss(); 36 | break; 37 | case R.id.tvConfirm: 38 | if (mOnLocationBackListener != null) { 39 | mOnLocationBackListener.onLocationBack(etLocationContent.getText().toString()); 40 | } 41 | dismiss(); 42 | break; 43 | } 44 | } 45 | 46 | public interface OnLocationBackListener { 47 | void onLocationBack(String text); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 12 | 13 | 17 | 18 | 22 | 23 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/main_input.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 18 | 33 | 34 | 40 | 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Calendar(觉得好用记得帮忙Star哦) 2 | === 3 | 注意事项: 4 | --- 5 | 该Demo没有进行网络数据的联调,使用了本地数据库进行存储数据,有需要网络配置的可删除本地数据库相关代码,再去进行网络数据显示即可。
6 | 7 | 交流QQ群: 8 | --- 9 | 小江Android交流群(259194144),进群备注Android、Github之类的关键词即可。 10 | 11 | 使用方法: 12 | --- 13 | * MonthCalendarView的使用
14 | ``` 15 | 26 | ``` 27 | 28 | * ScheduleLayout的使用
29 | 30 | layout_schedule.xml文件,必须包含MonthCalendarView、WeekCalendarView和ScheduleRecyclerView,可以直接引用改文件作为布局。
31 | 32 | ``` 33 | ScheduleLayout: 34 | app:default_view="week" 35 | app:default_view="month" 36 | app:auto_change_month_row="false" 37 | app:auto_change_month_row="true" 38 | ``` 39 | 40 | * 设置日期监听
41 | ``` 42 | slSchedule.setOnCalendarClickListener(new OnCalendarClickListener() { 43 | @Override 44 | public void onClickDate(int year, int month, int day) { 45 | //监听获得点击的年月日 46 | } 47 | }); 48 | ``` 49 | * 跳转到今天
50 | ``` 51 | slSchedule.getMonthCalendar().setTodayToView(); 52 | ``` 53 | * 跳转到某一天
54 | ``` 55 | slSchedule.initData(year, month, day); 56 | ``` 57 | * 缺点
58 | 59 | 该日历暂时没有支持无限循环,需要查看很多日期的朋友可以在MonthAdapter和WeekAdapter调高SIZE的大小即可。 60 | 61 | 效果图:
62 | --- 63 | ![image](https://github.com/xiaojianglaile/Calendar/blob/master/raw/jeek_image_1.gif) 64 | ![image](https://github.com/xiaojianglaile/Calendar/blob/master/raw/jeek_image_2.png) 65 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/base/app/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.base.app; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | /** 12 | * Created by Jimmy on 2016/7/31. 13 | */ 14 | public abstract class BaseFragment extends Fragment { 15 | 16 | protected Activity mActivity; 17 | protected View mView; 18 | 19 | @Nullable 20 | @Override 21 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 22 | mActivity = getActivity(); 23 | mView = initContentView(inflater, container); 24 | if (mView == null) 25 | throw new NullPointerException("Fragment content view is null."); 26 | bindView(); 27 | return mView; 28 | } 29 | 30 | @Override 31 | public void onActivityCreated(@Nullable Bundle savedInstanceState) { 32 | super.onActivityCreated(savedInstanceState); 33 | initData(); 34 | } 35 | 36 | @Nullable 37 | protected abstract View initContentView(LayoutInflater inflater, @Nullable ViewGroup container); 38 | 39 | @Override 40 | public void onResume() { 41 | super.onResume(); 42 | bindData(); 43 | } 44 | 45 | protected abstract void bindView(); 46 | 47 | /** 48 | * 请求动态数据 49 | */ 50 | protected void initData() { 51 | 52 | } 53 | 54 | /** 55 | * 绑定静态数据 56 | */ 57 | protected void bindData() { 58 | 59 | } 60 | 61 | protected VT searchViewById(int id) { 62 | if (mView == null) 63 | throw new NullPointerException("Fragment content view is null."); 64 | VT view = (VT) mView.findViewById(id); 65 | if (view == null) 66 | throw new NullPointerException("This resource id is invalid."); 67 | return view; 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_schedule_finish.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 19 | 26 | 27 | 39 | 40 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/data/JeekDBConfig.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.data; 2 | 3 | /** 4 | * Created by Jimmy on 2016/10/11 0011. 5 | */ 6 | public interface JeekDBConfig { 7 | 8 | int DATABASE_VERSION = 3; 9 | 10 | String DATABASE_NAME = "JeekCalendarDB"; 11 | 12 | String EVENT_SET_ID = "id"; 13 | String EVENT_SET_NAME = "name"; 14 | String EVENT_SET_COLOR = "color"; 15 | String EVENT_SET_ICON = "icon"; 16 | 17 | String EVENT_SET_TABLE_NAME = "EventSet"; 18 | 19 | String CREATE_EVENT_SET_TABLE_SQL = "CREATE TABLE " + EVENT_SET_TABLE_NAME + "(" 20 | + EVENT_SET_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 21 | + EVENT_SET_NAME + " VARCHAR(32), " 22 | + EVENT_SET_COLOR + " INTEGER, " 23 | + EVENT_SET_ICON + " INTEGER" + ")"; 24 | 25 | String DROP_EVENT_SET_TABLE_SQL = "DROP TABLE " + EVENT_SET_TABLE_NAME; 26 | 27 | String SCHEDULE_ID = "id"; 28 | String SCHEDULE_COLOR = "color"; 29 | String SCHEDULE_TITLE = "title"; 30 | String SCHEDULE_DESC = "desc"; 31 | String SCHEDULE_STATE = "state"; 32 | String SCHEDULE_TIME = "time"; 33 | String SCHEDULE_YEAR = "year"; 34 | String SCHEDULE_MONTH = "month"; 35 | String SCHEDULE_DAY = "day"; 36 | String SCHEDULE_LOCATION = "location"; 37 | String SCHEDULE_EVENT_SET_ID = "eid"; 38 | 39 | String SCHEDULE_TABLE_NAME = "Schedule"; 40 | 41 | String CREATE_SCHEDULE_TABLE_SQL = "CREATE TABLE " + SCHEDULE_TABLE_NAME + "(" 42 | + SCHEDULE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 43 | + SCHEDULE_COLOR + " INTEGER, " 44 | + SCHEDULE_TITLE + " VARCHAR(128), " 45 | + SCHEDULE_LOCATION + " VARCHAR(48), " 46 | + SCHEDULE_DESC + " VARCHAR(255), " 47 | + SCHEDULE_STATE + " INTEGER, " 48 | + SCHEDULE_TIME + " LONG, " 49 | + SCHEDULE_YEAR + " INTEGER, " 50 | + SCHEDULE_MONTH + " INTEGER, " 51 | + SCHEDULE_DAY + " INTEGER, " 52 | + SCHEDULE_EVENT_SET_ID + " INTEGER" + ")"; 53 | 54 | String DROP_SCHEDULE_TABLE_SQL = "DROP TABLE " + SCHEDULE_TABLE_NAME; 55 | 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_schedule.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 19 | 30 | 31 | 43 | 44 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/dialog/ConfirmDialog.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.dialog; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.jeek.calendar.R; 9 | 10 | /** 11 | * Created by Jimmy on 2016/10/18 0018. 12 | */ 13 | public class ConfirmDialog extends Dialog implements View.OnClickListener { 14 | 15 | private TextView tvTitle; 16 | private String mTitle; 17 | private OnClickListener mOnClickListener; 18 | private boolean mAutoDismiss; 19 | 20 | public ConfirmDialog(Context context, int id, OnClickListener onClickListener) { 21 | this(context, context.getString(id), onClickListener); 22 | } 23 | 24 | public ConfirmDialog(Context context, String title, OnClickListener onClickListener) { 25 | this(context, title, onClickListener, true); 26 | } 27 | 28 | public ConfirmDialog(Context context, String title, OnClickListener onClickListener, boolean autoDismiss) { 29 | super(context, R.style.DialogFullScreen); 30 | mTitle = title; 31 | mOnClickListener = onClickListener; 32 | mAutoDismiss = autoDismiss; 33 | initView(); 34 | } 35 | 36 | private void initView() { 37 | setContentView(R.layout.dialog_confirm); 38 | tvTitle = (TextView) findViewById(R.id.tvTitle); 39 | tvTitle.setText(mTitle); 40 | findViewById(R.id.tvCancel).setOnClickListener(this); 41 | findViewById(R.id.tvConfirm).setOnClickListener(this); 42 | } 43 | 44 | @Override 45 | public void onClick(View v) { 46 | switch (v.getId()) { 47 | case R.id.tvCancel: 48 | if (mOnClickListener != null) { 49 | mOnClickListener.onCancel(); 50 | } 51 | dismiss(); 52 | break; 53 | case R.id.tvConfirm: 54 | if (mOnClickListener != null) { 55 | mOnClickListener.onConfirm(); 56 | } 57 | dismiss(); 58 | break; 59 | } 60 | } 61 | 62 | public interface OnClickListener { 63 | void onCancel(); 64 | 65 | void onConfirm(); 66 | } 67 | 68 | @Override 69 | public void dismiss() { 70 | if (mAutoDismiss) { 71 | super.dismiss(); 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 48dp 4 | 56dp 5 | 0.5dp 6 | 7 | 36dp 8 | 48dp 9 | 288dp 10 | 5dp 11 | 15dp 12 | 13 13 | 14 | 12sp 15 | 14sp 16 | 16sp 17 | 18sp 18 | 20sp 19 | 20 | 50dp 21 | 4dp 22 | 1dp 23 | 4dp 24 | 2dp 25 | 3dp 26 | 50dp 27 | 28 | 3dp 29 | 6dp 30 | 8dp 31 | 10dp 32 | 12dp 33 | 14dp 34 | 16dp 35 | 18dp 36 | 20dp 37 | 30dp 38 | 39 | 1dp 40 | 50dp 41 | 46dp 42 | 43 | 2dp 44 | 16dp 45 | 46 | 60dp 47 | 36dp 48 | 54dp 49 | 30dp 50 | 51 | 10 52 | 28dp 53 | 224dp 54 | 55 | 56 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/bean/Schedule.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by Jimmy on 2016/10/8 0008. 7 | */ 8 | public class Schedule implements Serializable { 9 | 10 | private int id; 11 | private int color; 12 | private String title; 13 | private String desc; 14 | private String location; 15 | private int state; 16 | private long time; 17 | private int year; 18 | private int month; 19 | private int day; 20 | private int eventSetId; 21 | 22 | public int getId() { 23 | return id; 24 | } 25 | 26 | public void setId(int id) { 27 | this.id = id; 28 | } 29 | 30 | public int getColor() { 31 | return color; 32 | } 33 | 34 | public void setColor(int color) { 35 | this.color = color; 36 | } 37 | 38 | public String getTitle() { 39 | return title; 40 | } 41 | 42 | public void setTitle(String title) { 43 | this.title = title; 44 | } 45 | 46 | public String getDesc() { 47 | return desc == null ? "" : desc; 48 | } 49 | 50 | public void setDesc(String desc) { 51 | this.desc = desc; 52 | } 53 | 54 | public String getLocation() { 55 | return location == null ? "" : location; 56 | } 57 | 58 | public void setLocation(String location) { 59 | this.location = location; 60 | } 61 | 62 | public int getState() { 63 | return state; 64 | } 65 | 66 | public void setState(int state) { 67 | this.state = state; 68 | } 69 | 70 | public int getMonth() { 71 | return month; 72 | } 73 | 74 | public void setMonth(int month) { 75 | this.month = month; 76 | } 77 | 78 | public int getYear() { 79 | return year; 80 | } 81 | 82 | public void setYear(int year) { 83 | this.year = year; 84 | } 85 | 86 | public long getTime() { 87 | return time; 88 | } 89 | 90 | public void setTime(long time) { 91 | this.time = time; 92 | } 93 | 94 | public int getDay() { 95 | return day; 96 | } 97 | 98 | public void setDay(int day) { 99 | this.day = day; 100 | } 101 | 102 | public int getEventSetId() { 103 | return eventSetId; 104 | } 105 | 106 | public void setEventSetId(int eventSetId) { 107 | this.eventSetId = eventSetId; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/utils/JeekUtils.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.utils; 2 | 3 | import com.jeek.calendar.R; 4 | 5 | import java.text.SimpleDateFormat; 6 | import java.util.Date; 7 | import java.util.Locale; 8 | 9 | /** 10 | * Created by Jimmy on 2016/10/10 0010. 11 | */ 12 | public class JeekUtils { 13 | 14 | public static String timeStamp2Time(long time) { 15 | return new SimpleDateFormat("HH:mm", Locale.CHINA).format(new Date(time)); 16 | } 17 | 18 | public static int getEventSetColor(int color) { 19 | switch (color) { 20 | case 0: 21 | return R.color.holiday_text_color; 22 | case 1: 23 | return R.color.color_schedule_blue; 24 | case 2: 25 | return R.color.color_schedule_green; 26 | case 3: 27 | return R.color.color_schedule_pink; 28 | case 4: 29 | return R.color.color_schedule_orange; 30 | case 5: 31 | return R.color.color_schedule_yellow; 32 | default: 33 | return R.color.holiday_text_color; 34 | } 35 | } 36 | 37 | public static int getEventSetCircle(int color) { 38 | switch (color) { 39 | case 0: 40 | return R.drawable.purple_circle; 41 | case 1: 42 | return R.drawable.blue_circle; 43 | case 2: 44 | return R.drawable.green_circle; 45 | case 3: 46 | return R.drawable.pink_circle; 47 | case 4: 48 | return R.drawable.orange_circle; 49 | case 5: 50 | return R.drawable.yellow_circle; 51 | default: 52 | return R.drawable.purple_circle; 53 | } 54 | } 55 | 56 | public static int getScheduleBlockView(int color) { 57 | switch (color) { 58 | case 0: 59 | return R.drawable.purple_schedule_left_block; 60 | case 1: 61 | return R.drawable.blue_schedule_left_block; 62 | case 2: 63 | return R.drawable.green_schedule_left_block; 64 | case 3: 65 | return R.drawable.pink_schedule_left_block; 66 | case 4: 67 | return R.drawable.orange_schedule_left_block; 68 | case 5: 69 | return R.drawable.yellow_schedule_left_block; 70 | default: 71 | return R.drawable.purple_schedule_left_block; 72 | } 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/res/values-zh/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 即刻日程 3 | 再点一次退出应用 4 | 取消 5 | 确定 6 | 完成 7 | 已完成 8 | 开始 9 | 10 | 11 | 今天 12 | 13 | 一月 14 | 二月 15 | 三月 16 | 四月 17 | 五月 18 | 六月 19 | 七月 20 | 八月 21 | 九月 22 | 十月 23 | 十一月 24 | 十二月 25 | 26 | %d日 27 | %d年 28 | 29 | 30 | 输入您要做的事情 31 | 事件内容不能为空 32 | 事件详情设置 33 | 事件标题 34 | 显示已完成任务 35 | 隐藏已完成任务 36 | 是否删除该行程? 37 | 38 | 39 | 日程 40 | 事件集 41 | 添加事件清单 42 | 未分类 43 | 44 | 45 | 清单名称 46 | 颜色 47 | 清单名称不能为空 48 | 选择颜色 49 | 确定要删除该事件集? 50 | 51 | 小时 52 | 备忘录 53 | 请输入备忘信息 54 | yyyy年MM月dd日 HH:mm 55 | %1$s年%2$s月%3$s日 56 | 点击此处选择时间 57 | 点击此处选择地点 58 | 点击输入地点 59 | 添加地点 60 | 选择事件清单 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_confirm.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 23 | 24 | 31 | 32 | 44 | 45 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /calendar/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_event_set.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 19 | 20 | 25 | 26 | 32 | 33 | 43 | 44 | 49 | 50 | 51 | 52 | 59 | 60 | 61 | 62 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/month/MonthAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.month; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.support.v4.view.PagerAdapter; 6 | import android.util.SparseArray; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.view.ViewGroup.LayoutParams; 10 | 11 | import com.jeek.calendar.library.R; 12 | 13 | import org.joda.time.DateTime; 14 | 15 | /** 16 | * Created by Jimmy on 2016/10/6 0006. 17 | */ 18 | public class MonthAdapter extends PagerAdapter { 19 | 20 | private SparseArray mViews; 21 | private Context mContext; 22 | private TypedArray mArray; 23 | private MonthCalendarView mMonthCalendarView; 24 | private int mMonthCount; 25 | 26 | public MonthAdapter(Context context, TypedArray array, MonthCalendarView monthCalendarView) { 27 | mContext = context; 28 | mArray = array; 29 | mMonthCalendarView = monthCalendarView; 30 | mViews = new SparseArray<>(); 31 | mMonthCount = array.getInteger(R.styleable.MonthCalendarView_month_count, 48); 32 | } 33 | 34 | @Override 35 | public int getCount() { 36 | return mMonthCount; 37 | } 38 | 39 | @Override 40 | public Object instantiateItem(ViewGroup container, int position) { 41 | if (mViews.get(position) == null) { 42 | int date[] = getYearAndMonth(position); 43 | MonthView monthView = new MonthView(mContext, mArray, date[0], date[1]); 44 | monthView.setId(position); 45 | monthView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 46 | monthView.invalidate(); 47 | monthView.setOnDateClickListener(mMonthCalendarView); 48 | mViews.put(position, monthView); 49 | } 50 | container.addView(mViews.get(position)); 51 | return mViews.get(position); 52 | } 53 | 54 | private int[] getYearAndMonth(int position) { 55 | int date[] = new int[2]; 56 | DateTime time = new DateTime(); 57 | time = time.plusMonths(position - mMonthCount / 2); 58 | date[0] = time.getYear(); 59 | date[1] = time.getMonthOfYear() - 1; 60 | return date; 61 | } 62 | 63 | @Override 64 | public void destroyItem(ViewGroup container, int position, Object object) { 65 | container.removeView((View) object); 66 | } 67 | 68 | @Override 69 | public boolean isViewFromObject(View view, Object object) { 70 | return view == object; 71 | } 72 | 73 | public SparseArray getViews() { 74 | return mViews; 75 | } 76 | 77 | public int getMonthCount() { 78 | return mMonthCount; 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 1.8 51 | 52 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | JeekCalendar 3 | Click to exit. 4 | Cancel 5 | Confirm 6 | Finish 7 | Finished 8 | Start 9 | 10 | 11 | Today 12 | 13 | January 14 | February 15 | March 16 | April 17 | May 18 | June 19 | July 20 | August 21 | September 22 | October 23 | November 24 | December 25 | 26 | %d day 27 | %d- 28 | 29 | 30 | Input what to do 31 | Content can\'t be empty. 32 | Detail setting 33 | Schedule title 34 | Show completed 35 | Hide completed 36 | Delete the schedule? 37 | 38 | 39 | Schedule 40 | Events 41 | Add event list 42 | Unclassified 43 | 44 | 45 | List name 46 | Color 47 | List name can\'t be empty. 48 | Choose color 49 | Delete events? 50 | 51 | Hour 52 | Reminders 53 | Input the reminders 54 | yyyy-MM-dd HH:mm 55 | %1$s-%2$s-%3$s 56 | Click to choose time 57 | Click to select location 58 | Click to input location 59 | Add spot 60 | Choose events 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/adapter/SelectEventSetAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | import android.widget.ImageView; 9 | import android.widget.RadioButton; 10 | import android.widget.TextView; 11 | 12 | import com.jeek.calendar.R; 13 | import com.jimmy.common.bean.EventSet; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * Created by Jimmy on 2016/10/15 0015. 19 | */ 20 | public class SelectEventSetAdapter extends BaseAdapter { 21 | 22 | private Context mContext; 23 | private List mEventSets; 24 | private int mSelectPosition; 25 | 26 | public SelectEventSetAdapter(Context context, List eventSets, int selectPosition) { 27 | mContext = context; 28 | mEventSets = eventSets; 29 | mSelectPosition = selectPosition; 30 | } 31 | 32 | @Override 33 | public int getCount() { 34 | return mEventSets.size(); 35 | } 36 | 37 | @Override 38 | public Object getItem(int position) { 39 | return mEventSets.get(position); 40 | } 41 | 42 | @Override 43 | public long getItemId(int position) { 44 | return mEventSets.get(position).getId(); 45 | } 46 | 47 | @Override 48 | public View getView(int position, View convertView, ViewGroup parent) { 49 | ViewHolder holder; 50 | EventSet eventSet = mEventSets.get(position); 51 | if (convertView == null) { 52 | holder = new ViewHolder(); 53 | convertView = LayoutInflater.from(mContext).inflate(R.layout.item_select_event_set, parent, false); 54 | holder.ivEventSetIcon = (ImageView) convertView.findViewById(R.id.ivEventSetIcon); 55 | holder.tvEventSetName = (TextView) convertView.findViewById(R.id.tvEventSetName); 56 | holder.rbEventSet = (RadioButton) convertView.findViewById(R.id.rbEventSet); 57 | convertView.setTag(holder); 58 | } else { 59 | holder = (ViewHolder) convertView.getTag(); 60 | } 61 | holder.tvEventSetName.setText(eventSet.getName()); 62 | holder.ivEventSetIcon.setImageResource(eventSet.getId() == 0 ? R.mipmap.ic_select_event_set_category : R.mipmap.ic_select_event_set_icon); 63 | holder.rbEventSet.setChecked(position == mSelectPosition); 64 | return convertView; 65 | } 66 | 67 | private class ViewHolder { 68 | private ImageView ivEventSetIcon; 69 | private TextView tvEventSetName; 70 | private RadioButton rbEventSet; 71 | } 72 | 73 | public void setSelectPosition(int selectPosition) { 74 | mSelectPosition = selectPosition; 75 | notifyDataSetChanged(); 76 | } 77 | 78 | public int getSelectPosition() { 79 | return mSelectPosition; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/week/WeekAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.week; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.support.v4.view.PagerAdapter; 6 | import android.util.SparseArray; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | import com.jeek.calendar.library.R; 11 | 12 | import org.joda.time.DateTime; 13 | 14 | /** 15 | * Created by Jimmy on 2016/10/7 0007. 16 | */ 17 | public class WeekAdapter extends PagerAdapter { 18 | 19 | private SparseArray mViews; 20 | private Context mContext; 21 | private TypedArray mArray; 22 | private WeekCalendarView mWeekCalendarView; 23 | private DateTime mStartDate; 24 | private int mWeekCount = 220; 25 | 26 | public WeekAdapter(Context context, TypedArray array, WeekCalendarView weekCalendarView) { 27 | mContext = context; 28 | mArray = array; 29 | mWeekCalendarView = weekCalendarView; 30 | mViews = new SparseArray<>(); 31 | initStartDate(); 32 | mWeekCount = array.getInteger(R.styleable.WeekCalendarView_week_count, 220); 33 | } 34 | 35 | private void initStartDate() { 36 | mStartDate = new DateTime(); 37 | mStartDate = mStartDate.plusDays(-mStartDate.getDayOfWeek() % 7); 38 | } 39 | 40 | @Override 41 | public int getCount() { 42 | return mWeekCount; 43 | } 44 | 45 | @Override 46 | public Object instantiateItem(ViewGroup container, int position) { 47 | for (int i = 0; i < 3; i++) { 48 | if (position - 2 + i >= 0 && position - 2 + i < mWeekCount && mViews.get(position - 2 + i) == null) { 49 | instanceWeekView(position - 2 + i); 50 | } 51 | } 52 | container.addView(mViews.get(position)); 53 | return mViews.get(position); 54 | } 55 | 56 | @Override 57 | public boolean isViewFromObject(View view, Object object) { 58 | return view == object; 59 | } 60 | 61 | @Override 62 | public void destroyItem(ViewGroup container, int position, Object object) { 63 | container.removeView((View) object); 64 | } 65 | 66 | public SparseArray getViews() { 67 | return mViews; 68 | } 69 | 70 | public int getWeekCount() { 71 | return mWeekCount; 72 | } 73 | 74 | public WeekView instanceWeekView(int position) { 75 | WeekView weekView = new WeekView(mContext, mArray, mStartDate.plusWeeks(position - mWeekCount / 2)); 76 | weekView.setId(position); 77 | weekView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 78 | weekView.setOnWeekClickListener(mWeekCalendarView); 79 | weekView.invalidate(); 80 | mViews.put(position, weekView); 81 | return weekView; 82 | } 83 | 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/res/layout/simple_title_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | 25 | 26 | 35 | 36 | 49 | 50 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #736EB0 4 | #736EB0 5 | #FF8594 6 | #F0F1F5 7 | #FFFFFF 8 | #00FFFFFF 9 | #FF0000 10 | 11 | #9082BD 12 | #f6af80 13 | #E67986 14 | #F7E373 15 | #84C5A3 16 | #679BE4 17 | #B9B9BD 18 | #3D81E2 19 | #EC4A5F 20 | #272E3E 21 | #7F838F 22 | #E3E1EE 23 | 24 | #9E9DC9 25 | #9082BD 26 | 27 | #ADADB9 28 | 29 | #353655 30 | #454567 31 | #2D2D51 32 | #A5A1C2 33 | #73728B 34 | #303054 35 | 36 | #706F7D 37 | #EEEEEE 38 | #F4F4F4 39 | #282D40 40 | 41 | #B6B6B6 42 | #9FB6B6B6 43 | #8F81BC 44 | #9F8F81BC 45 | 46 | #9E9DC9 47 | #B2B1D3 48 | #8D8BA0 49 | 50 | #B8B5D4 51 | #C6C0DC 52 | #A68BFF 53 | #7452E4 54 | #65000000 55 | 56 | #282D40 57 | #ABABAD 58 | #F4F4F4 59 | #AAA8B3 60 | #272E3E 61 | 62 | 63 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/WeekBarView.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.graphics.Canvas; 6 | import android.graphics.Color; 7 | import android.graphics.Paint; 8 | import android.util.AttributeSet; 9 | import android.util.DisplayMetrics; 10 | import android.view.View; 11 | 12 | import com.jeek.calendar.library.R; 13 | 14 | /** 15 | * Created by Jimmy on 2016/10/6 0006. 16 | */ 17 | public class WeekBarView extends View { 18 | 19 | private int mWeekTextColor; 20 | private int mWeekSize; 21 | private Paint mPaint; 22 | private DisplayMetrics mDisplayMetrics; 23 | private String[] mWeekString; 24 | 25 | public WeekBarView(Context context) { 26 | this(context, null); 27 | } 28 | 29 | public WeekBarView(Context context, AttributeSet attrs) { 30 | this(context, attrs, 0); 31 | } 32 | 33 | public WeekBarView(Context context, AttributeSet attrs, int defStyleAttr) { 34 | super(context, attrs, defStyleAttr); 35 | initAttrs(context, attrs); 36 | initPaint(); 37 | } 38 | 39 | private void initAttrs(Context context, AttributeSet attrs) { 40 | TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.WeekBarView); 41 | mWeekTextColor = array.getColor(R.styleable.WeekBarView_week_text_color, Color.parseColor("#4588E3")); 42 | mWeekSize = array.getInteger(R.styleable.WeekBarView_week_text_size, 13); 43 | mWeekString = context.getResources().getStringArray(R.array.calendar_week); 44 | array.recycle(); 45 | } 46 | 47 | private void initPaint() { 48 | mDisplayMetrics = getResources().getDisplayMetrics(); 49 | mPaint = new Paint(); 50 | mPaint.setColor(mWeekTextColor); 51 | mPaint.setAntiAlias(true); 52 | mPaint.setTextSize(mWeekSize * mDisplayMetrics.scaledDensity); 53 | } 54 | 55 | @Override 56 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 57 | int widthSize = MeasureSpec.getSize(widthMeasureSpec); 58 | int widthMode = MeasureSpec.getMode(widthMeasureSpec); 59 | int heightSize = MeasureSpec.getSize(heightMeasureSpec); 60 | int heightMode = MeasureSpec.getMode(heightMeasureSpec); 61 | if (heightMode == MeasureSpec.AT_MOST) { 62 | heightSize = mDisplayMetrics.densityDpi * 30; 63 | } 64 | if (widthMode == MeasureSpec.AT_MOST) { 65 | widthSize = mDisplayMetrics.densityDpi * 300; 66 | } 67 | setMeasuredDimension(widthSize, heightSize); 68 | } 69 | 70 | @Override 71 | protected void onDraw(Canvas canvas) { 72 | int width = getWidth(); 73 | int height = getHeight(); 74 | int columnWidth = width / 7; 75 | for (int i = 0; i < mWeekString.length; i++) { 76 | String text = mWeekString[i]; 77 | int fontWidth = (int) mPaint.measureText(text); 78 | int startX = columnWidth * i + (columnWidth - fontWidth) / 2; 79 | int startY = (int) (height / 2 - (mPaint.ascent() + mPaint.descent()) / 2); 80 | canvas.drawText(text, startX, startY, mPaint); 81 | } 82 | } 83 | 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/dialog/SelectColorDialog.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.dialog; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.view.View; 6 | import android.widget.LinearLayout; 7 | import android.widget.RelativeLayout; 8 | 9 | import com.jeek.calendar.R; 10 | 11 | /** 12 | * Created by Jimmy on 2016/10/12 0012. 13 | */ 14 | public class SelectColorDialog extends Dialog implements View.OnClickListener { 15 | 16 | private OnSelectColorListener mOnSelectColorListener; 17 | private int mColor; 18 | private View[] mColorBorderView; 19 | private View[] mColorView; 20 | 21 | public SelectColorDialog(Context context, OnSelectColorListener onSelectColorListener) { 22 | super(context, R.style.DialogFullScreen); 23 | mOnSelectColorListener = onSelectColorListener; 24 | setContentView(R.layout.dialog_select_color); 25 | initView(); 26 | } 27 | 28 | private void initView() { 29 | findViewById(R.id.tvCancel).setOnClickListener(this); 30 | findViewById(R.id.tvConfirm).setOnClickListener(this); 31 | mColorBorderView = new View[6]; 32 | mColorView = new View[6]; 33 | LinearLayout llTopColor = (LinearLayout) findViewById(R.id.llTopColor); 34 | LinearLayout llBottomColor = (LinearLayout) findViewById(R.id.llBottomColor); 35 | for (int i = 0; i < llTopColor.getChildCount(); i++) { 36 | RelativeLayout child = (RelativeLayout) llTopColor.getChildAt(i); 37 | mColorBorderView[i] = child.getChildAt(0); 38 | mColorView[i] = child.getChildAt(1); 39 | final int finalI = i; 40 | child.setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View v) { 43 | changeColor(finalI); 44 | } 45 | }); 46 | } 47 | for (int i = 0; i < llBottomColor.getChildCount(); i++) { 48 | RelativeLayout child = (RelativeLayout) llBottomColor.getChildAt(i); 49 | mColorBorderView[i + 3] = child.getChildAt(0); 50 | mColorView[i + 3] = child.getChildAt(1); 51 | final int finalI = i; 52 | child.setOnClickListener(new View.OnClickListener() { 53 | @Override 54 | public void onClick(View v) { 55 | changeColor(finalI + 3); 56 | } 57 | }); 58 | } 59 | } 60 | 61 | private void changeColor(int position) { 62 | mColor = position; 63 | for (int i = 0; i < mColorBorderView.length; i++) { 64 | mColorBorderView[i].setVisibility(position == i ? View.VISIBLE : View.GONE); 65 | } 66 | } 67 | 68 | @Override 69 | public void onClick(View v) { 70 | switch (v.getId()) { 71 | case R.id.tvCancel: 72 | dismiss(); 73 | break; 74 | case R.id.tvConfirm: 75 | if (mOnSelectColorListener != null) { 76 | mOnSelectColorListener.onSelectColor(mColor); 77 | } 78 | dismiss(); 79 | break; 80 | } 81 | } 82 | 83 | public interface OnSelectColorListener { 84 | void onSelectColor(int color); 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/activity/AddEventSetActivity.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.activity; 2 | 3 | import android.content.Intent; 4 | import android.os.AsyncTask; 5 | import android.text.TextUtils; 6 | import android.view.View; 7 | import android.widget.EditText; 8 | import android.widget.TextView; 9 | 10 | import com.jeek.calendar.R; 11 | import com.jimmy.common.bean.EventSet; 12 | import com.jeek.calendar.dialog.SelectColorDialog; 13 | import com.jeek.calendar.task.eventset.AddEventSetTask; 14 | import com.jeek.calendar.utils.JeekUtils; 15 | import com.jimmy.common.base.app.BaseActivity; 16 | import com.jimmy.common.listener.OnTaskFinishedListener; 17 | import com.jimmy.common.util.ToastUtils; 18 | 19 | /** 20 | * Created by Jimmy on 2016/10/12 0012. 21 | */ 22 | public class AddEventSetActivity extends BaseActivity implements View.OnClickListener, OnTaskFinishedListener, SelectColorDialog.OnSelectColorListener { 23 | 24 | public static int ADD_EVENT_SET_CANCEL = 1; 25 | public static int ADD_EVENT_SET_FINISH = 2; 26 | public static String EVENT_SET_OBJ = "event.set.obj"; 27 | 28 | private EditText etEventSetName; 29 | private View vEventSetColor; 30 | private SelectColorDialog mSelectColorDialog; 31 | 32 | private int mColor = 0; 33 | 34 | @Override 35 | protected void bindView() { 36 | setContentView(R.layout.activity_add_event_set); 37 | TextView tvTitle = searchViewById(R.id.tvTitle); 38 | tvTitle.setText(getString(R.string.menu_add_event_set)); 39 | etEventSetName = searchViewById(R.id.etEventSetName); 40 | vEventSetColor = searchViewById(R.id.vEventSetColor); 41 | searchViewById(R.id.tvCancel).setOnClickListener(this); 42 | searchViewById(R.id.tvFinish).setOnClickListener(this); 43 | searchViewById(R.id.rlEventSetColor).setOnClickListener(this); 44 | } 45 | 46 | @Override 47 | public void onClick(View v) { 48 | switch (v.getId()) { 49 | case R.id.tvCancel: 50 | setResult(ADD_EVENT_SET_CANCEL); 51 | finish(); 52 | break; 53 | case R.id.tvFinish: 54 | addEventSet(); 55 | break; 56 | case R.id.rlEventSetColor: 57 | showSelectColorDialog(); 58 | break; 59 | } 60 | } 61 | 62 | private void showSelectColorDialog() { 63 | if (mSelectColorDialog == null) 64 | mSelectColorDialog = new SelectColorDialog(this, this); 65 | mSelectColorDialog.show(); 66 | } 67 | 68 | private void addEventSet() { 69 | String name = etEventSetName.getText().toString(); 70 | if (TextUtils.isEmpty(name)) { 71 | ToastUtils.showShortToast(this, R.string.event_set_name_is_not_null); 72 | } else { 73 | EventSet eventSet = new EventSet(); 74 | eventSet.setName(name); 75 | eventSet.setColor(mColor); 76 | new AddEventSetTask(this, this, eventSet).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 77 | } 78 | } 79 | 80 | @Override 81 | public void onTaskFinished(EventSet data) { 82 | setResult(ADD_EVENT_SET_FINISH, new Intent().putExtra(EVENT_SET_OBJ, data)); 83 | finish(); 84 | } 85 | 86 | @Override 87 | public void onSelectColor(int color) { 88 | mColor = color; 89 | vEventSetColor.setBackgroundResource(JeekUtils.getEventSetCircle(color)); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/week/WeekCalendarView.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.week; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.support.v4.view.ViewPager; 6 | import android.util.AttributeSet; 7 | import android.util.SparseArray; 8 | 9 | import com.jeek.calendar.library.R; 10 | import com.jeek.calendar.widget.calendar.OnCalendarClickListener; 11 | 12 | /** 13 | * Created by Jimmy on 2016/10/7 0007. 14 | */ 15 | public class WeekCalendarView extends ViewPager implements OnWeekClickListener { 16 | 17 | private OnCalendarClickListener mOnCalendarClickListener; 18 | private WeekAdapter mWeekAdapter; 19 | 20 | public WeekCalendarView(Context context) { 21 | this(context, null); 22 | } 23 | 24 | public WeekCalendarView(Context context, AttributeSet attrs) { 25 | super(context, attrs); 26 | initAttrs(context, attrs); 27 | addOnPageChangeListener(mOnPageChangeListener); 28 | } 29 | 30 | private void initAttrs(Context context, AttributeSet attrs) { 31 | initWeekAdapter(context, context.obtainStyledAttributes(attrs, R.styleable.WeekCalendarView)); 32 | } 33 | 34 | private void initWeekAdapter(Context context, TypedArray array) { 35 | mWeekAdapter = new WeekAdapter(context, array, this); 36 | setAdapter(mWeekAdapter); 37 | setCurrentItem(mWeekAdapter.getWeekCount() / 2, false); 38 | } 39 | 40 | @Override 41 | public void onClickDate(int year, int month, int day) { 42 | if (mOnCalendarClickListener != null) { 43 | mOnCalendarClickListener.onClickDate(year, month, day); 44 | } 45 | } 46 | 47 | private OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() { 48 | @Override 49 | public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 50 | 51 | } 52 | 53 | @Override 54 | public void onPageSelected(final int position) { 55 | WeekView weekView = mWeekAdapter.getViews().get(position); 56 | if (weekView != null) { 57 | if (mOnCalendarClickListener != null) { 58 | mOnCalendarClickListener.onPageChange(weekView.getSelectYear(), weekView.getSelectMonth(), weekView.getSelectDay()); 59 | } 60 | weekView.clickThisWeek(weekView.getSelectYear(), weekView.getSelectMonth(), weekView.getSelectDay()); 61 | } else { 62 | WeekCalendarView.this.postDelayed(new Runnable() { 63 | @Override 64 | public void run() { 65 | onPageSelected(position); 66 | } 67 | }, 50); 68 | } 69 | } 70 | 71 | @Override 72 | public void onPageScrollStateChanged(int state) { 73 | 74 | } 75 | }; 76 | 77 | /** 78 | * 设置点击日期监听 79 | * @param onCalendarClickListener 80 | */ 81 | public void setOnCalendarClickListener(OnCalendarClickListener onCalendarClickListener) { 82 | mOnCalendarClickListener = onCalendarClickListener; 83 | } 84 | 85 | public SparseArray getWeekViews() { 86 | return mWeekAdapter.getViews(); 87 | } 88 | 89 | public WeekAdapter getWeekAdapter() { 90 | return mWeekAdapter; 91 | } 92 | 93 | public WeekView getCurrentWeekView() { 94 | return getWeekViews().get(getCurrentItem()); 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /app/src/main/res/layout/main_title_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 22 | 23 | 26 | 27 | 34 | 35 | 42 | 43 | 52 | 53 | 61 | 62 | 63 | 64 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_input_location.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 23 | 24 | 28 | 29 | 43 | 44 | 48 | 49 | 50 | 57 | 58 | 70 | 71 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /.idea/markdown-navigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 33 | 34 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_select_event_set.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 23 | 24 | 28 | 29 | 38 | 39 | 43 | 44 | 56 | 57 | 64 | 65 | 77 | 78 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/dialog/SelectEventSetDialog.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.dialog; 2 | 3 | import android.app.Activity; 4 | import android.app.Dialog; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.os.AsyncTask; 8 | import android.view.View; 9 | import android.widget.AdapterView; 10 | import android.widget.ListView; 11 | 12 | import com.jeek.calendar.R; 13 | import com.jeek.calendar.activity.AddEventSetActivity; 14 | import com.jeek.calendar.adapter.SelectEventSetAdapter; 15 | import com.jimmy.common.bean.EventSet; 16 | import com.jeek.calendar.task.eventset.LoadEventSetTask; 17 | import com.jimmy.common.listener.OnTaskFinishedListener; 18 | 19 | import java.util.List; 20 | 21 | /** 22 | * Created by Jimmy on 2016/10/15 0015. 23 | */ 24 | public class SelectEventSetDialog extends Dialog implements View.OnClickListener, OnTaskFinishedListener> { 25 | 26 | public static int ADD_EVENT_SET_CODE = 1; 27 | 28 | private Context mContext; 29 | private OnSelectEventSetListener mOnSelectEventSetListener; 30 | private int mId; 31 | 32 | private ListView lvEventSets; 33 | 34 | private SelectEventSetAdapter mSelectEventSetAdapter; 35 | private List mEventSets; 36 | 37 | public SelectEventSetDialog(Context context, OnSelectEventSetListener onSelectEventSetListener, int id) { 38 | super(context, R.style.DialogFullScreen); 39 | mContext = context; 40 | mOnSelectEventSetListener = onSelectEventSetListener; 41 | mId = id; 42 | initView(); 43 | } 44 | 45 | private void initView() { 46 | setContentView(R.layout.dialog_select_event_set); 47 | findViewById(R.id.tvCancel).setOnClickListener(this); 48 | findViewById(R.id.tvConfirm).setOnClickListener(this); 49 | findViewById(R.id.tvAddEventSet).setOnClickListener(this); 50 | lvEventSets = (ListView) findViewById(R.id.lvEventSets); 51 | initData(); 52 | } 53 | 54 | private void initData() { 55 | new LoadEventSetTask(getContext(), this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 56 | lvEventSets.setOnItemClickListener(new AdapterView.OnItemClickListener() { 57 | @Override 58 | public void onItemClick(AdapterView parent, View view, int position, long id) { 59 | mSelectEventSetAdapter.setSelectPosition(position); 60 | } 61 | }); 62 | } 63 | 64 | @Override 65 | public void onClick(View v) { 66 | switch (v.getId()) { 67 | case R.id.tvCancel: 68 | dismiss(); 69 | break; 70 | case R.id.tvConfirm: 71 | if (mOnSelectEventSetListener != null) { 72 | mOnSelectEventSetListener.onSelectEventSet(mEventSets.get(mSelectEventSetAdapter.getSelectPosition())); 73 | } 74 | dismiss(); 75 | break; 76 | case R.id.tvAddEventSet: 77 | ((Activity) mContext).startActivityForResult(new Intent(mContext, AddEventSetActivity.class), ADD_EVENT_SET_CODE); 78 | break; 79 | } 80 | } 81 | 82 | public void addEventSet(EventSet eventSet) { 83 | mEventSets.add(eventSet); 84 | mSelectEventSetAdapter.notifyDataSetChanged(); 85 | } 86 | 87 | @Override 88 | public void onTaskFinished(List data) { 89 | mEventSets = data; 90 | EventSet eventSet = new EventSet(); 91 | eventSet.setName(getContext().getString(R.string.menu_no_category)); 92 | mEventSets.add(0, eventSet); 93 | int position = 0; 94 | for (int i = 0; i < mEventSets.size(); i++) { 95 | if (mEventSets.get(i).getId() == mId) { 96 | position = i; 97 | break; 98 | } 99 | } 100 | mSelectEventSetAdapter = new SelectEventSetAdapter(mContext, mEventSets, position); 101 | lvEventSets.setAdapter(mSelectEventSetAdapter); 102 | } 103 | 104 | public interface OnSelectEventSetListener { 105 | void onSelectEventSet(EventSet eventSet); 106 | } 107 | 108 | } 109 | -------------------------------------------------------------------------------- /common/src/main/java/com/jimmy/common/data/EventSetDao.java: -------------------------------------------------------------------------------- 1 | package com.jimmy.common.data; 2 | 3 | import android.content.ContentValues; 4 | import android.content.Context; 5 | import android.database.Cursor; 6 | import android.database.sqlite.SQLiteDatabase; 7 | 8 | import com.jimmy.common.bean.EventSet; 9 | 10 | import java.util.ArrayList; 11 | import java.util.HashMap; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | /** 16 | * Created by Jimmy on 2016/10/11 0011. 17 | */ 18 | public class EventSetDao { 19 | 20 | private JeekSQLiteHelper mHelper; 21 | 22 | private EventSetDao(Context context) { 23 | mHelper = new JeekSQLiteHelper(context); 24 | } 25 | 26 | public static EventSetDao getInstance(Context context) { 27 | return new EventSetDao(context); 28 | } 29 | 30 | public int addEventSet(EventSet eventSet) { 31 | SQLiteDatabase db = mHelper.getWritableDatabase(); 32 | ContentValues values = new ContentValues(); 33 | values.put(JeekDBConfig.EVENT_SET_NAME, eventSet.getName()); 34 | values.put(JeekDBConfig.EVENT_SET_COLOR, eventSet.getColor()); 35 | values.put(JeekDBConfig.EVENT_SET_ICON, eventSet.getIcon()); 36 | long row = db.insert(JeekDBConfig.EVENT_SET_TABLE_NAME, null, values); 37 | db.close(); 38 | return row > 0 ? getLastEventSetId() : 0; 39 | } 40 | 41 | public Map getAllEventSetMap() { 42 | Map eventSets = new HashMap<>(); 43 | SQLiteDatabase db = mHelper.getReadableDatabase(); 44 | Cursor cursor = db.query(JeekDBConfig.EVENT_SET_TABLE_NAME, null, null, null, null, null, null); 45 | EventSet eventSet; 46 | while (cursor.moveToNext()) { 47 | eventSet = new EventSet(); 48 | eventSet.setId(cursor.getInt(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_ID))); 49 | eventSet.setName(cursor.getString(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_NAME))); 50 | eventSet.setColor(cursor.getInt(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_COLOR))); 51 | eventSet.setIcon(cursor.getInt(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_ICON))); 52 | eventSets.put(eventSet.getId(), eventSet); 53 | } 54 | cursor.close(); 55 | db.close(); 56 | mHelper.close(); 57 | return eventSets; 58 | } 59 | 60 | public List getAllEventSet() { 61 | List eventSets = new ArrayList<>(); 62 | SQLiteDatabase db = mHelper.getReadableDatabase(); 63 | Cursor cursor = db.query(JeekDBConfig.EVENT_SET_TABLE_NAME, null, null, null, null, null, null); 64 | EventSet eventSet; 65 | while (cursor.moveToNext()) { 66 | eventSet = new EventSet(); 67 | eventSet.setId(cursor.getInt(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_ID))); 68 | eventSet.setName(cursor.getString(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_NAME))); 69 | eventSet.setColor(cursor.getInt(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_COLOR))); 70 | eventSet.setIcon(cursor.getInt(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_ICON))); 71 | eventSets.add(eventSet); 72 | } 73 | cursor.close(); 74 | db.close(); 75 | mHelper.close(); 76 | return eventSets; 77 | } 78 | 79 | public boolean removeEventSet(int id) { 80 | SQLiteDatabase db = mHelper.getWritableDatabase(); 81 | int row = db.delete(JeekDBConfig.EVENT_SET_TABLE_NAME, String.format("%s=?", JeekDBConfig.EVENT_SET_ID), new String[]{String.valueOf(id)}); 82 | db.close(); 83 | mHelper.close(); 84 | return row != 0; 85 | } 86 | 87 | private int getLastEventSetId() { 88 | SQLiteDatabase db = mHelper.getReadableDatabase(); 89 | Cursor cursor = db.query(JeekDBConfig.EVENT_SET_TABLE_NAME, null, null, null, null, null, null); 90 | int id = 0; 91 | if (cursor.moveToLast()) { 92 | id = cursor.getInt(cursor.getColumnIndex(JeekDBConfig.EVENT_SET_ID)); 93 | } 94 | cursor.close(); 95 | db.close(); 96 | mHelper.close(); 97 | return id; 98 | } 99 | 100 | } 101 | -------------------------------------------------------------------------------- /app/src/main/java/com/jeek/calendar/adapter/EventSetAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.adapter; 2 | 3 | import android.content.Context; 4 | import android.os.AsyncTask; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.ImageButton; 10 | import android.widget.TextView; 11 | 12 | import com.jeek.calendar.R; 13 | import com.jeek.calendar.activity.MainActivity; 14 | import com.jimmy.common.bean.EventSet; 15 | import com.jeek.calendar.dialog.ConfirmDialog; 16 | import com.jeek.calendar.task.eventset.RemoveEventSetTask; 17 | import com.jeek.calendar.utils.JeekUtils; 18 | import com.jeek.calendar.widget.SlideDeleteView; 19 | import com.jimmy.common.listener.OnTaskFinishedListener; 20 | 21 | import java.util.List; 22 | 23 | /** 24 | * Created by Jimmy on 2016/10/12 0012. 25 | */ 26 | public class EventSetAdapter extends RecyclerView.Adapter { 27 | 28 | private Context mContext; 29 | private List mEventSets; 30 | 31 | public EventSetAdapter(Context context, List eventSets) { 32 | mContext = context; 33 | mEventSets = eventSets; 34 | } 35 | 36 | @Override 37 | public EventSetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 38 | return new EventSetViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_event_set, parent, false)); 39 | } 40 | 41 | @Override 42 | public int getItemCount() { 43 | return mEventSets.size(); 44 | } 45 | 46 | @Override 47 | public void onBindViewHolder(EventSetViewHolder holder, final int position) { 48 | final EventSet eventSet = mEventSets.get(position); 49 | holder.sdvEventSet.close(false); 50 | holder.tvEventSetName.setText(eventSet.getName()); 51 | holder.vEventSetColor.setBackgroundResource(JeekUtils.getEventSetColor(eventSet.getColor())); 52 | holder.ibEventSetDelete.setOnClickListener(new View.OnClickListener() { 53 | @Override 54 | public void onClick(View v) { 55 | showDeleteEventSetDialog(eventSet, position); 56 | } 57 | }); 58 | holder.sdvEventSet.setOnContentClickListener(new SlideDeleteView.OnContentClickListener() { 59 | @Override 60 | public void onContentClick() { 61 | gotoEventSetFragment(eventSet); 62 | } 63 | }); 64 | } 65 | 66 | private void showDeleteEventSetDialog(final EventSet eventSet, final int position) { 67 | new ConfirmDialog(mContext, R.string.event_set_delete_this_event_set, new ConfirmDialog.OnClickListener() { 68 | @Override 69 | public void onCancel() { 70 | 71 | } 72 | 73 | @Override 74 | public void onConfirm() { 75 | new RemoveEventSetTask(mContext, new OnTaskFinishedListener() { 76 | @Override 77 | public void onTaskFinished(Boolean data) { 78 | if (data) { 79 | removeItem(position); 80 | } 81 | } 82 | }, eventSet.getId()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 83 | } 84 | }).show(); 85 | } 86 | 87 | private void gotoEventSetFragment(EventSet eventSet) { 88 | if (mContext instanceof MainActivity) { 89 | ((MainActivity) mContext).gotoEventSetFragment(eventSet); 90 | } 91 | } 92 | 93 | protected class EventSetViewHolder extends RecyclerView.ViewHolder { 94 | 95 | private SlideDeleteView sdvEventSet; 96 | private View vEventSetColor; 97 | private TextView tvEventSetName; 98 | private ImageButton ibEventSetDelete; 99 | 100 | public EventSetViewHolder(View itemView) { 101 | super(itemView); 102 | sdvEventSet = (SlideDeleteView) itemView.findViewById(R.id.sdvEventSet); 103 | vEventSetColor = itemView.findViewById(R.id.vEventSetColor); 104 | tvEventSetName = (TextView) itemView.findViewById(R.id.tvEventSetName); 105 | ibEventSetDelete = (ImageButton) itemView.findViewById(R.id.ibEventSetDelete); 106 | } 107 | } 108 | 109 | public void changeAllData(List eventSets) { 110 | mEventSets.clear(); 111 | mEventSets.addAll(eventSets); 112 | notifyDataSetChanged(); 113 | } 114 | 115 | public void insertItem(EventSet eventSet) { 116 | mEventSets.add(eventSet); 117 | notifyItemInserted(mEventSets.size() - 1); 118 | } 119 | 120 | public void removeItem(int position) { 121 | mEventSets.remove(position); 122 | notifyDataSetChanged(); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /calendar/src/main/java/com/jeek/calendar/widget/calendar/month/MonthCalendarView.java: -------------------------------------------------------------------------------- 1 | package com.jeek.calendar.widget.calendar.month; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.support.v4.view.ViewPager; 6 | import android.util.AttributeSet; 7 | import android.util.SparseArray; 8 | 9 | import com.jeek.calendar.library.R; 10 | import com.jeek.calendar.widget.calendar.OnCalendarClickListener; 11 | 12 | import java.util.Calendar; 13 | 14 | /** 15 | * Created by Jimmy on 2016/10/6 0006. 16 | */ 17 | public class MonthCalendarView extends ViewPager implements OnMonthClickListener { 18 | 19 | private MonthAdapter mMonthAdapter; 20 | private OnCalendarClickListener mOnCalendarClickListener; 21 | 22 | public MonthCalendarView(Context context) { 23 | this(context, null); 24 | } 25 | 26 | public MonthCalendarView(Context context, AttributeSet attrs) { 27 | super(context, attrs); 28 | initAttrs(context, attrs); 29 | addOnPageChangeListener(mOnPageChangeListener); 30 | } 31 | 32 | private void initAttrs(Context context, AttributeSet attrs) { 33 | initMonthAdapter(context, context.obtainStyledAttributes(attrs, R.styleable.MonthCalendarView)); 34 | } 35 | 36 | private void initMonthAdapter(Context context, TypedArray array) { 37 | mMonthAdapter = new MonthAdapter(context, array, this); 38 | setAdapter(mMonthAdapter); 39 | setCurrentItem(mMonthAdapter.getMonthCount() / 2, false); 40 | } 41 | 42 | @Override 43 | public void onClickThisMonth(int year, int month, int day) { 44 | if (mOnCalendarClickListener != null) { 45 | mOnCalendarClickListener.onClickDate(year, month, day); 46 | } 47 | } 48 | 49 | @Override 50 | public void onClickLastMonth(int year, int month, int day) { 51 | MonthView monthDateView = mMonthAdapter.getViews().get(getCurrentItem() - 1); 52 | if (monthDateView != null) { 53 | monthDateView.setSelectYearMonth(year, month, day); 54 | } 55 | setCurrentItem(getCurrentItem() - 1, true); 56 | } 57 | 58 | @Override 59 | public void onClickNextMonth(int year, int month, int day) { 60 | MonthView monthDateView = mMonthAdapter.getViews().get(getCurrentItem() + 1); 61 | if (monthDateView != null) { 62 | monthDateView.setSelectYearMonth(year, month, day); 63 | monthDateView.invalidate(); 64 | } 65 | onClickThisMonth(year, month, day); 66 | setCurrentItem(getCurrentItem() + 1, true); 67 | } 68 | 69 | private OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() { 70 | @Override 71 | public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 72 | } 73 | 74 | @Override 75 | public void onPageSelected(final int position) { 76 | MonthView monthView = mMonthAdapter.getViews().get(getCurrentItem()); 77 | if (monthView != null) { 78 | monthView.clickThisMonth(monthView.getSelectYear(), monthView.getSelectMonth(), monthView.getSelectDay()); 79 | if (mOnCalendarClickListener != null) { 80 | mOnCalendarClickListener.onPageChange(monthView.getSelectYear(), monthView.getSelectMonth(), monthView.getSelectDay()); 81 | } 82 | } else { 83 | MonthCalendarView.this.postDelayed(new Runnable() { 84 | @Override 85 | public void run() { 86 | onPageSelected(position); 87 | } 88 | }, 50); 89 | } 90 | } 91 | 92 | @Override 93 | public void onPageScrollStateChanged(int state) { 94 | } 95 | }; 96 | 97 | /** 98 | * 跳转到今天 99 | */ 100 | public void setTodayToView() { 101 | setCurrentItem(mMonthAdapter.getMonthCount() / 2, true); 102 | MonthView monthView = mMonthAdapter.getViews().get(mMonthAdapter.getMonthCount() / 2); 103 | if (monthView != null) { 104 | Calendar calendar = Calendar.getInstance(); 105 | monthView.clickThisMonth(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE)); 106 | } 107 | } 108 | 109 | /** 110 | * 设置点击日期监听 111 | * 112 | * @param onCalendarClickListener 113 | */ 114 | public void setOnCalendarClickListener(OnCalendarClickListener onCalendarClickListener) { 115 | mOnCalendarClickListener = onCalendarClickListener; 116 | } 117 | 118 | public SparseArray getMonthViews() { 119 | return mMonthAdapter.getViews(); 120 | } 121 | 122 | public MonthView getCurrentMonthView() { 123 | return getMonthViews().get(getCurrentItem()); 124 | } 125 | 126 | } 127 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_add_event_set.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 11 | 12 | 18 | 19 | 26 | 27 | 31 | 32 | 37 | 38 | 51 | 52 | 60 | 61 | 62 | 63 | 64 | 65 | 72 | 73 | 77 | 78 | 84 | 85 | 93 | 94 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /calendar/src/main/res/layout/layout_schedule.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 26 | 27 | 30 | 31 | 35 | 36 | 48 | 49 | 50 | 63 | 64 | 65 | 66 | 71 | 72 | 82 | 83 | 88 | 89 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | --------------------------------------------------------------------------------