Compare commits

...

66 Commits

Author SHA1 Message Date
Dai cc25ac71aa 演示视频
4 years ago
Dai 2f154bc36b 编译手册
4 years ago
Dai 7e7d93e3f4 apk
4 years ago
p28679143 2360930176 Merge pull request '日记部分逻辑修改2.0' (#17) from p86231950/ShowMe:master into master
4 years ago
harvey 7f5205804b 日记部分逻辑修改2.0
4 years ago
p28679143 ee8f4f23a8 Merge pull request '修改部分逻辑' (#16) from p86231950/ShowMe:master into master
4 years ago
harvey e59024139d 日记部分逻辑修改
4 years ago
Dai c7e2ad4910 汇报PPT
4 years ago
Dai 519719336c 生成apk
4 years ago
Dai 6a4f80f8e6 修复了一些问题
4 years ago
p28679143 ddf89e35da Merge pull request '整合后的可运行版本,但还未测试' (#15) from p86231950/ShowMe:master into master
4 years ago
harvey 5e7e4d69d1 整合后的可运行版本,但还未测试
4 years ago
p28679143 6e50be2883 Merge pull request '之前的最初运行版本存在问题,因此更新src文件' (#14) from p86231950/ShowMe:master into master
4 years ago
harvey 8bf0bd9b4a 之前的最初运行版本存在问题,因此更新src文件
4 years ago
p28679143 561898494b Merge pull request '整合已有代码,生成可运行的最初版本' (#13) from p86231950/ShowMe:master into master
4 years ago
harvey 66797be1dc 整合已有代码,生成可运行的最初版本
4 years ago
Dai bd2b879be3 rm
4 years ago
Dai bb177f62a1 添加日程和课程表
4 years ago
p28679143 f27fd32235 Merge pull request '更新课程表和日程代码' (#12) from p14895062/ShowMe:master into master
4 years ago
lisiqidaer 1c5fa39d6b ShowMe
4 years ago
lisiqidaer 7857e30487 DatabaseHelper
4 years ago
p28679143 4d92e44671 Merge pull request 'Dairy' (#11) from p87350214/ShowMe:master into master
4 years ago
xrj 0349eb95b3 日记模块实现,包含所有java文件和xml文件,以及图标。
4 years ago
p28679143 67117366ba Merge pull request ' 添加日历的控制类和视图类并在MainActivity中调用' (#10) from p86231950/ShowMe:master into master
4 years ago
harvey a9b1069887 在日历中调用DataBase
4 years ago
harvey 982d3d18e7 correct build.gradle
4 years ago
harvey 8a6b631969 添加日历的控制类和视图类并在MainActivity中调用
4 years ago
Dai 4a707b85d5 DataBase
4 years ago
p28679143 42c5cfe175 Merge pull request '添加CalendarView模块同时添加实体类CalendarDay及其相关类' (#9) from p86231950/ShowMe:master into master
4 years ago
harvey 0a17871cf8 添加CalendarView模块同时添加实体类CalendarDay及其相关类
4 years ago
Dai ee240c206c init code
4 years ago
Dai 9afe0585f8 Merge branch 'master' of https://bdgit.educoder.net/p28679143/ShowMe
4 years ago
Dai 7a97b48dcf 软件设计
4 years ago
p28679143 25444ec193 Delete 'showmeDesign.docx'
4 years ago
p28679143 081028f398 Delete 'UIDesign.mdj'
4 years ago
Dai dc813cc452 初稿
4 years ago
Dai 802662b4fa 初稿
4 years ago
Dai 1db6fb3456 界面设计
4 years ago
Dai c322afafab 1
4 years ago
Dai 938858a1ff 用户界面
4 years ago
p28679143 087ded44a3 Merge pull request 'UI原型设计概述和界面跳转顺序图' (#8) from p14895062/ShowMe:master into master
4 years ago
p14895062 fd9e03d741 UI设计顺序图
4 years ago
p14895062 178fd249e6 ui界面原型设计概况
4 years ago
Dai c604ab339b 详细设计
4 years ago
Dai babbac1830 kcb
4 years ago
Dai e3b18dac6a 设计
4 years ago
Dai f7af8195dd 设计
4 years ago
p28679143 90bcea321b Merge pull request '更新需求设计模型中的用例图' (#6) from p86231950/ShowMe:master into master
4 years ago
harvey aab0b01906 提交日历模块详细设计并且更新需求设计中的体系结构设计
4 years ago
harvey 428508730c Merge remote-tracking branch 'upstream/master'
4 years ago
harvey 702e063ee7 更新需求设计模型中的用例图
4 years ago
Dai 7b973b90ee 用例设计
4 years ago
p28679143 ac0f77211c Merge pull request '更新用例图和顺序图并提交模型' (#5) from p86231950/ShowMe:master into master
4 years ago
idealisthhh a147faf9b4 提交需求设计
4 years ago
idealisthhh fb6d0c7760 添加model & 更新了用例图和顺序图
4 years ago
Dai 3629b0acd6 体系结构设计
4 years ago
Dai f599ba1993 需求说明1.1
4 years ago
p28679143 e641ade8e8 Merge pull request '更新需求规格说明书中的用例顺序图' (#4) from p86231950/ShowMe:master into master
4 years ago
idealisthhh c12c21d6ee 更新用例顺序图
4 years ago
Dai d542b353c6 需求构思”
4 years ago
Dai 55fee54a63 需求说明
4 years ago
Dai 16325b083d 1
4 years ago
Dai f5773b3551 需求说明
4 years ago
Dai a8f78b532a 需求构思
4 years ago
Dai cf753e8797 1
4 years ago
p28679143 094e65d33b Merge pull request 'UI原型设计' (#3) from p14895062/ShowMe:lisiqi into master
4 years ago

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

@ -0,0 +1,15 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="PLATFORM" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/CalendarView" />
<option value="$PROJECT_DIR$/Database" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
</component>
</project>

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
<option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="14">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="2" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
<item index="3" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="5" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
<item index="6" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="7" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
<item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
<item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
<item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.Nullable" />
<item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="13">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="2" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
<item index="3" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="5" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
<item index="6" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
<item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
<item index="11" class="java.lang.String" itemvalue="io.reactivex.annotations.NonNull" />
<item index="12" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>

@ -0,0 +1,62 @@
Index: app/src/main/java/com/diary/showme/diary/ui/CardActivity.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>package com.diary.showme.diary.ui;\r\n\r\nimport android.app.Activity;\r\nimport android.content.Intent;\r\nimport android.os.Bundle;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.content.Context;\r\nimport android.graphics.Color;\r\nimport android.os.Environment;\r\nimport android.widget.EditText;\r\nimport android.widget.Toast;\r\n\r\nimport androidx.annotation.Nullable;\r\nimport androidx.appcompat.app.AppCompatActivity;\r\n\r\nimport com.diary.showme.Course.AddCourseActivity;\r\nimport com.diary.showme.Course.Course;\r\nimport com.diary.showme.Course.CourseActivity;\r\nimport com.diary.showme.R;\r\n\r\n\r\npublic class CardActivity extends AppCompatActivity {\r\n\r\n private Button card1;\r\n\r\n private Button card2;\r\n\r\n private Button card3;\r\n\r\n @Override\r\n protected void onCreate(Bundle savedInstanceState) {\r\n super.onCreate(savedInstanceState);\r\n setContentView(R.layout.card);\r\n\r\n card1 = findViewById(R.id.card1);\r\n card2 = findViewById(R.id.card2);\r\n card3 = findViewById(R.id.card3);\r\n card1.setOnClickListener(new View.OnClickListener() {\r\n @Override\r\n public void onClick(View v) {\r\n startActivityForResult(new Intent(CardActivity.this, AddDiaryActivity.class), 0);\r\n }\r\n });\r\n card2.setOnClickListener(new View.OnClickListener() {\r\n @Override\r\n public void onClick(View v) {\r\n startActivityForResult(new Intent(CardActivity.this, AddDiaryActivity.class), 0);\r\n }\r\n });\r\n card3.setOnClickListener(new View.OnClickListener() {\r\n @Override\r\n public void onClick(View v) {\r\n startActivityForResult(new Intent(CardActivity.this, AddDiaryActivity.class), 0);\r\n }\r\n });\r\n }\r\n\r\n public static void startActivity(Context context) {\r\n Intent intent = new Intent(context, CardActivity.class);\r\n context.startActivity(intent);\r\n }\r\n\r\n\r\n}\r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/src/main/java/com/diary/showme/diary/ui/CardActivity.java (revision c7e2ad49109864f6c4a19759f6af43db764bb204)
+++ app/src/main/java/com/diary/showme/diary/ui/CardActivity.java (date 1626049324133)
@@ -39,19 +39,22 @@
card1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- startActivityForResult(new Intent(CardActivity.this, AddDiaryActivity.class), 0);
+ Intent intent = new Intent(CardActivity.this, AddDiaryActivity.class);
+ startActivity(intent);
}
});
card2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- startActivityForResult(new Intent(CardActivity.this, AddDiaryActivity.class), 0);
+ Intent intent = new Intent(CardActivity.this, AddDiaryActivity.class);
+ startActivity(intent);
}
});
card3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- startActivityForResult(new Intent(CardActivity.this, AddDiaryActivity.class), 0);
+ Intent intent = new Intent(CardActivity.this, AddDiaryActivity.class);
+ startActivity(intent);
}
});
}
Index: app/src/main/res/layout/question_item.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+><?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n android:layout_width=\"match_parent\"\r\n android:layout_height=\"wrap_content\">\r\n\r\n <LinearLayout\r\n android:layout_width=\"match_parent\"\r\n android:layout_height=\"match_parent\"\r\n android:orientation=\"horizontal\">\r\n\r\n <TextView\r\n android:id=\"@+id/question_content\"\r\n android:layout_width=\"match_parent\"\r\n android:layout_height=\"wrap_content\"\r\n android:gravity=\"center\"\r\n android:textSize=\"24sp\"/>\r\n\r\n </LinearLayout>\r\n\r\n</FrameLayout>
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/src/main/res/layout/question_item.xml (revision c7e2ad49109864f6c4a19759f6af43db764bb204)
+++ app/src/main/res/layout/question_item.xml (date 1626048966859)
@@ -8,12 +8,14 @@
android:layout_height="match_parent"
android:orientation="horizontal">
- <TextView
+ <Button
android:id="@+id/question_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:gravity="center"
- android:textSize="24sp"/>
+ android:layout_weight="1"
+ android:background="#A4CF2626"
+ android:text="今天有遇到什么开心的事情吗?"
+ />
</LinearLayout>

@ -0,0 +1,4 @@
<changelist name="Uncommitted_changes_before_Update_at_2021_7_12_8_40_[Default_Changelist]" date="1626050458233" recycled="true" deleted="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_2021_7_12_8_40_[Default_Changelist]/shelved.patch" />
<option name="DESCRIPTION" value="Uncommitted changes before Update at 2021/7/12 8:40 [Default Changelist]" />
</changelist>

@ -0,0 +1,14 @@
<changelist name="Uncommitted_changes_before_Update_at_2021_7_12_9_04_[Default_Changelist]" date="1626051883392" recycled="true" deleted="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_2021_7_12_9_04_[Default_Changelist]/shelved.patch" />
<option name="DESCRIPTION" value="Uncommitted changes before Update at 2021/7/12 9:04 [Default Changelist]" />
<binary>
<option name="BEFORE_PATH" value="../app-release.apk" />
<option name="AFTER_PATH" value="../app-release.apk" />
<option name="SHELVED_PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_2021_7_12_9_04_[Default_Changelist]/app-release.apk" />
</binary>
<binary>
<option name="BEFORE_PATH" value="app/release/app-release.apk" />
<option name="AFTER_PATH" />
<option name="SHELVED_PATH" />
</binary>
</changelist>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>showme</name>
<comment>Project showme created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1625906374722</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

@ -0,0 +1,13 @@
arguments=
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir=
eclipse.preferences.version=1
gradle.user.home=
java.home=C\:/Software/StayHungry/JDK15
jvm.arguments=
offline.mode=false
override.workspace.settings=true
show.console.view=true
show.executions.view=true

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-15/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>CalendarView</name>
<comment>Project CalendarView created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1625906374711</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

@ -0,0 +1,2 @@
connection.project.dir=..
eclipse.preferences.version=1

@ -0,0 +1,39 @@
plugins {
id 'com.android.library'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
minSdkVersion 17
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation project(path: ':Database')
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

@ -0,0 +1,26 @@
package com.idealist.calendarview;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.idealist.calendarview.test", appContext.getPackageName());
}
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.idealist.calendarview">
</manifest>

@ -0,0 +1,86 @@
package com.idealist.calendarview;
public class CalendarAttr {
static int RecTop;
private int mItemHeight;
private int mRowCount;
private int mViewHeight;
private int mCalendarType;
private int mTextSize;
private int mScrollLevel;
private int TouchSlop;
public CalendarAttr() {
mItemHeight = State.DEFAULT_ITEM_HEIGHT;
mTextSize = State.DEFAULT_TEXT_SIZE;
}
public int getRowCount() {
return mRowCount;
}
private void setRowCount(int mRowCount) {
this.mRowCount = mRowCount;
mViewHeight = mItemHeight * mRowCount;
}
public int getItemHeight() {
return mItemHeight;
}
public void setItemHeight(int mItemHeight) {
this.mItemHeight = mItemHeight;
mViewHeight = mRowCount * mItemHeight;
}
public int getViewHeight() {
return mViewHeight;
}
public void setViewHeight(int mViewHeight) {
this.mViewHeight = mViewHeight;
mItemHeight = mViewHeight / mRowCount;
}
public int getTextSize() {
return mTextSize;
}
public void setTextSize(int mTextSize) {
this.mTextSize = mTextSize;
}
public int getCalendarType() {
return mCalendarType;
}
public void setCalendarType(int mCalendarType) {
this.mCalendarType = mCalendarType;
setRowCount((mCalendarType == State.VIEW_WEEK) ? 1 : 6);
}
public static int getRecTop() {
return RecTop;
}
public static void setRecTop(int recTop) {
RecTop = recTop;
}
public int getScrollLevel() {
return mScrollLevel;
}
public void setScrollLevel(int mScrollLevel) {
this.mScrollLevel = mScrollLevel;
}
}

@ -0,0 +1,97 @@
package com.idealist.calendarview;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class CalendarDay {
private int year;
private int month;
private int day;
private boolean isCurrDay;
private boolean markSchedule;
private int mMonthState;
private int mSelectState;
public CalendarDay() {
;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public boolean isCurrDay() {
return isCurrDay;
}
public void setCurrDay(boolean currDay) {
this.isCurrDay = currDay;
}
public int getMonthState() {
return mMonthState;
}
public void setMonthState(int mMonthState) {
this.mMonthState = mMonthState;
}
public int getSelectState() {
return mSelectState;
}
public void setSelectState(int mSelectState) {
this.mSelectState = mSelectState;
}
public boolean isMarkSchedule() {
return markSchedule;
}
public void setMarkSchedule(boolean markSchedule) {
this.markSchedule = markSchedule;
}
@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof CalendarDay) {
return ((CalendarDay) obj).day == this.day && ((CalendarDay) obj).month == this.month &&
((CalendarDay) obj).year == this.year;
}
return super.equals(obj);
}
@NonNull
@Override
public String toString() {
return this.year + "-" + this.month + "-" + this.day;
}
}

@ -0,0 +1,152 @@
package com.idealist.calendarview;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
@CoordinatorLayout.DefaultBehavior(CalendarPagerBehavior.class)
public class CalendarPager extends ViewPager {
private CalendarAttr attr;
private OnPageChangeListener mOnPageChangeListener;
public static int CURRENT_DAY_INDEX = 1000;
private int mCurrPosition = CURRENT_DAY_INDEX;
private int pageScrollState = ViewPager.SCROLL_STATE_IDLE;
public CalendarPager(Context context) {
super(context, null);
}
public CalendarPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initPager();
}
private void initPager() {
ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mCurrPosition = position;
if (mOnPageChangeListener != null) {
CalendarViewAdapter adapter = (CalendarViewAdapter) getAdapter();
assert adapter != null;
adapter.updateViewByScrollHorizontally(position);
mOnPageChangeListener.onPageSelected(position);
}
}
@Override
public void onPageScrollStateChanged(int state) {
pageScrollState = state;
}
};
addOnPageChangeListener(pageChangeListener);
}
public void setAttr(CalendarAttr attr) {
this.attr = attr;
}
@Override
public void setAdapter(@Nullable PagerAdapter adapter) {
super.setAdapter(adapter);
setCurrentItem(1000);
mCurrPosition = 1000;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (attr != null && attr.getCalendarType() == State.VIEW_FULL) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int height = 0xffffff;
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec,
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
height = Math.min(h, height);
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void setmOnPageChangeListener(OnPageChangeListener mOnPageChangeListener) {
this.mOnPageChangeListener = mOnPageChangeListener;
}
public void selectOtherMonth(int offset) {
CalendarViewAdapter adapter = (CalendarViewAdapter) getAdapter();
adapter.saveSelectedDate();
adapter.updateDayInViewState(mCurrPosition + offset);
setCurrentItem(mCurrPosition + offset);
}
public int getViewHeight() {
return attr.getViewHeight();
}
public int getItemHeight() {
return attr.getItemHeight();
}
public int getScrollLevel() {
return attr.getScrollLevel();
}
public void setScrollLevel(int scrollLevel) {
attr.setScrollLevel(scrollLevel);
}
public int getPageScrollState() {
return pageScrollState;
}
public void setPageScrollState(int pageScrollState) {
this.pageScrollState = pageScrollState;
}
public CalendarAttr getAttr() {
return attr;
}
public int getmCurrPosition() {
return mCurrPosition;
}
/**
*
*
* @return
*/
public int getTopMovableDistance() {
CalendarViewAdapter adapter = (CalendarViewAdapter) getAdapter();
assert adapter != null;
return attr.getItemHeight() * (CalendarUtils.getWeekOfMonth(adapter.getSelectDay()) - 1);
}
public interface OnPageChangeListener {
void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
void onPageSelected(int position);
void onPageScrollStateChanged(int state);
}
}

@ -0,0 +1,182 @@
package com.idealist.calendarview;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.recyclerview.widget.RecyclerView;
import static android.content.ContentValues.TAG;
public class CalendarPagerBehavior extends CoordinatorLayout.Behavior<CalendarPager> {
private int mTop = 0;
private int touchSlop = 1;
@Override
public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull CalendarPager child, @NonNull View dependency) {
return dependency instanceof RecyclerView;
}
@Override
public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull CalendarPager child, int layoutDirection) {
parent.onLayoutChild(child, layoutDirection);
child.offsetTopAndBottom(mTop);
return true;
}
private int confirm = 0;
private float downX, downY, lastY, lastTop;
private boolean isVerticalScroll;
private boolean directionUpa;
@Override
public boolean onTouchEvent(@NonNull CoordinatorLayout parent, @NonNull CalendarPager child, @NonNull MotionEvent ev) {
if (downY > lastTop) {
return false;
}
Log.i(TAG, "onTouchEvent: onTouchEvent");
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if (isVerticalScroll) {
directionUpa = ev.getY() < lastY;
if (child.getScrollLevel() == State.LEVEL_TOP) {
CalendarAttr.setRecTop(State.DEFAULT_ITEM_HEIGHT + (int) (ev.getY() - downY));
CalendarUtils.scroll(parent.getChildAt(1), (int) (lastY - ev.getY()),
State.DEFAULT_ITEM_HEIGHT, State.DEFAULT_ITEM_HEIGHT * 6);
} else if (child.getScrollLevel() == State.LEVEL_MEDIUM) {
CalendarAttr.setRecTop(State.DEFAULT_ITEM_HEIGHT * 6 + (int) (ev.getY() - downY));
if (directionUpa) {
CalendarUtils.scroll(parent.getChildAt(1), (int) (lastY - ev.getY()),
State.DEFAULT_ITEM_HEIGHT, State.DEFAULT_ITEM_HEIGHT * 6);
} else {
CalendarUtils.scroll(parent.getChildAt(1), (int) (lastY - ev.getY()),
State.DEFAULT_ITEM_HEIGHT * 6, State.DEFAULT_ITEM_HEIGHT_FULL * 6);
}
} else {
CalendarAttr.setRecTop(child.getViewHeight() + (int) (ev.getY() - downY));
CalendarUtils.scroll(parent.getChildAt(1), (int) (lastY - ev.getY()),
State.DEFAULT_ITEM_HEIGHT * 6, State.DEFAULT_ITEM_HEIGHT_FULL * 6);
}
lastY = ev.getY();
return true;
}
break;
case MotionEvent.ACTION_UP:
if (isVerticalScroll) {
CalendarViewAdapter adapter = (CalendarViewAdapter) child.getAdapter();
if (adapter != null) {
if (directionUpa) {
if (adapter.getCalendarType() == State.VIEW_MONTH) {
child.setScrollLevel(State.LEVEL_TOP);
adapter.changeCalendarType(State.VIEW_WEEK);
CalendarUtils.scrollTo(parent, (RecyclerView) parent.getChildAt(1),
State.DEFAULT_ITEM_HEIGHT, 300);
} else if (adapter.getCalendarType() == State.VIEW_FULL) {
child.setScrollLevel(State.LEVEL_MEDIUM);
adapter.changeCalendarType(State.VIEW_MONTH);
CalendarUtils.scrollTo(parent, (RecyclerView) parent.getChildAt(1),
State.DEFAULT_ITEM_HEIGHT * 6, 300);
}
} else {
if (adapter.getCalendarType() == State.VIEW_WEEK) {
child.setScrollLevel(State.LEVEL_MEDIUM);
adapter.changeCalendarType(State.VIEW_MONTH);
CalendarUtils.scrollTo(parent, (RecyclerView) parent.getChildAt(1),
State.DEFAULT_ITEM_HEIGHT * 6, 300);
} else if (adapter.getCalendarType() == State.VIEW_MONTH) {
child.setScrollLevel(State.LEVEL_BOTTOM);
adapter.changeCalendarType(State.VIEW_FULL);
CalendarUtils.scrollTo(parent, (RecyclerView) parent.getChildAt(1),
State.DEFAULT_ITEM_HEIGHT_FULL * 6, 300);
}
}
}
isVerticalScroll = false;
return true;
}
break;
}
isVerticalScroll = false;
return false;
}
@Override
public boolean onInterceptTouchEvent(@NonNull CoordinatorLayout parent, @NonNull CalendarPager child, @NonNull MotionEvent ev) {
Log.i(TAG, "onInterceptTouchEvent: Try to intercept!" + isVerticalScroll);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
downY = ev.getY();
lastTop = CalendarAttr.getRecTop();
lastY = downY;
break;
case MotionEvent.ACTION_MOVE:
if (downY > lastTop) {
return false;
}
if (Math.abs(ev.getY() - downY) > 25 && Math.abs(ev.getX() - downX) <= 25 && !isVerticalScroll) {
isVerticalScroll = true;
return true;
}
break;
case MotionEvent.ACTION_UP:
if (isVerticalScroll) {
isVerticalScroll = false;
return true;
}
break;
}
return isVerticalScroll;
}
private int dependencyViewTop = -1;
@Override
public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull CalendarPager child, @NonNull View dependency) {
Log.i(TAG, "onDependentViewChanged: !");
CalendarViewAdapter adapter = (CalendarViewAdapter) child.getAdapter();
if (dependencyViewTop != -1) {
int dy = dependency.getTop() - dependencyViewTop;
int top = child.getTop();
if (dy > touchSlop) {
assert adapter != null;
adapter.changeCalendarType(State.VIEW_MONTH);
} else if (dy < -touchSlop) {
assert adapter != null;
adapter.changeCalendarType(State.VIEW_WEEK);
}
if (dy > -top)
dy = -top;
if (dy < -top - child.getTopMovableDistance()) {
dy = -top - child.getTopMovableDistance();
}
child.offsetTopAndBottom(dy);
// adapter.changeCalendarType(State.VIEW_WEEK);
}
if (dependencyViewTop > child.getItemHeight() - 24
&& dependencyViewTop < child.getItemHeight() + 24
&& mTop > -touchSlop - child.getTopMovableDistance()
&& mTop < touchSlop - child.getTopMovableDistance()) {
child.setScrollLevel(State.LEVEL_TOP);
adapter.changeCalendarType(State.VIEW_WEEK);
}
if (dependencyViewTop > child.getViewHeight() - 24
&& dependencyViewTop < child.getViewHeight() + 24
&& mTop < touchSlop
&& mTop > -touchSlop) {
child.setScrollLevel(State.LEVEL_MEDIUM);
adapter.changeCalendarType(State.VIEW_MONTH);
}
return true;
}
}

@ -0,0 +1,363 @@
package com.idealist.calendarview;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Scroller;
import android.database.sqlite.SQLiteDatabase;
import android.database.Cursor;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.diary.database.utils.ScheduleSQLUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import static android.content.ContentValues.TAG;
public class CalendarUtils {
/**
*
*
* @param year year
* @return
*/
public static boolean isLeapYear(int year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
/**
*
*
* @param year
* @param month
* @return
*/
public static int getDayNumOfMonth(int year, int month) {
int res = 31;
switch (month) {
case 4:
case 6:
case 9:
case 11:
res = 30;
break;
case 2:
if (isLeapYear(year))
res = 29;
else
res = 28;
break;
default:
break;
}
return res;
}
/**
*
* 0 - 6 -
*
* @param year
* @param month
* @return
*/
private static int getDayOfWeek(int year, int month, int day) {
Calendar date = Calendar.getInstance();
date.set(year, month - 1, day, 12, 0);
return date.get(Calendar.DAY_OF_WEEK) - 1;
}
/**
* Items
*
* @param year year
* @param month month
* @return List<CalendarDay>
*/
public static List<CalendarDay> generateItemForMonthView(int year, int month) {
List<CalendarDay> dates = new ArrayList<>();
CalendarDay currDay = getCurrDay();
int daysNumOfMonth = getDayNumOfMonth(year, month);
int preDiff = getDayOfWeek(year, month, 1);
int preYear = year;
int nextYear = year;
int preMonth = month - 1;
int nextMonth = month + 1;
if (month == 1) {
preYear = year - 1;
preMonth = 12;
} else if (month == 12) {
nextYear = year + 1;
nextMonth = 1;
}
int dayIndex = 1;
for (int i = 1; i <= 42; ++i) {
CalendarDay date = new CalendarDay();
if (i <= preDiff) {
date.setYear(preYear);
date.setMonth(preMonth);
date.setDay(getDayNumOfMonth(preYear, preMonth) - preDiff + i);
date.setMonthState(State.DAY_PAST_MONTH);
} else if (i > preDiff + daysNumOfMonth) {
date.setYear(nextYear);
date.setMonth(nextMonth);
date.setDay(dayIndex++);
date.setMonthState(State.DAY_NEXT_MONTH);
} else {
date.setYear(year);
date.setMonth(month);
date.setDay(i - preDiff);
date.setMonthState(State.DAY_CURR_MONTH);
date.setCurrDay(date.equals(currDay));
}
dates.add(date);
if (date.equals(CalendarViewAdapter.loadSelectedDate())) {
date.setSelectState(State.DAY_SELECT);
}
if (ScheduleSQLUtils.isScheduleMarked(date.toString())) {
date.setMarkSchedule(true);
}
}
return dates;
}
/**
* Items
*
* @param year int
* @param month int
* @param day int
* @return List Items
*/
public static List<CalendarDay> generateItemForWeekView(int year, int month, int day) {
List<CalendarDay> dates = new ArrayList<>();
CalendarDay currDay = getCurrDay();
int dayOfWeekOfCurr = getDayOfWeek(year, month, day);
int dayNumOfCurrMonth = getDayNumOfMonth(year, month);
int setYear = year;
int setMonth = month;
if (day - dayOfWeekOfCurr <= 0) {
setMonth = month - 1;
if (month == 1) {
setYear = year - 1;
setMonth = 12;
}
} else if (day + (6 - dayOfWeekOfCurr) > dayNumOfCurrMonth) {
setMonth = month + 1;
if (month == 12) {
setYear = year + 1;
setMonth = 1;
}
}
for (int i = 0; i < 7; ++i) {
CalendarDay date = new CalendarDay();
if (day - dayOfWeekOfCurr + i <= 0) {
date.setYear(setYear);
date.setMonth(setMonth);
date.setDay(day - dayOfWeekOfCurr + i + getDayNumOfMonth(setYear, setMonth));
date.setMonthState(State.DAY_PAST_MONTH);
} else if (day - dayOfWeekOfCurr + i > dayNumOfCurrMonth) {
date.setYear(setYear);
date.setMonth(setMonth);
date.setDay(day - dayOfWeekOfCurr + i - dayNumOfCurrMonth);
date.setMonthState(State.DAY_NEXT_MONTH);
} else {
date.setYear(year);
date.setMonth(month);
date.setDay(day - dayOfWeekOfCurr + i);
date.setMonthState(State.DAY_CURR_MONTH);
date.setCurrDay(date.equals(currDay));
}
dates.add(date);
if (date.equals(CalendarViewAdapter.loadSelectedDate())) {
date.setSelectState(State.DAY_SELECT);
}
if (ScheduleSQLUtils.isScheduleMarked(date.toString())) {
date.setMarkSchedule(true);
}
}
return dates;
}
/**
*
*
* @return
*/
public static CalendarDay getCurrDay() {
CalendarDay day = new CalendarDay();
Calendar date = Calendar.getInstance();
day.setDay(date.get(Calendar.DATE));
day.setMonth(date.get(Calendar.MONTH) + 1);
day.setYear(date.get(Calendar.YEAR));
day.setCurrDay(true);
// Log.e("util", day.toString());
return day;
}
/**
*
*
* @param day CalendarDay
* @param offset int -1 1
* @return CalendarDay
*/
public static CalendarDay getNearWeekDay(CalendarDay day, int offset) {
Calendar date = Calendar.getInstance();
CalendarDay resDay = new CalendarDay();
date.set(day.getYear(), day.getMonth() - 1, day.getDay(), 12, 0);
date.add(Calendar.DATE, offset * 7);
resDay.setYear(date.get(Calendar.YEAR));
resDay.setMonth(date.get(Calendar.MONTH) + 1);
resDay.setDay(date.get(Calendar.DATE));
return resDay;
}
/**
*
*
* @param day CalendarDay
* @param offset -1 1
* @return CalendarDay
*/
public static CalendarDay getNearMonthDay(CalendarDay day, int offset) {
if (offset == 0)
return day;
Calendar date = Calendar.getInstance();
CalendarDay resDay = new CalendarDay();
date.set(day.getYear(), day.getMonth() - 1, day.getDay(), 12, 0);
date.add(Calendar.MONTH, offset);
resDay.setYear(date.get(Calendar.YEAR));
resDay.setMonth(date.get(Calendar.MONTH) + 1);
resDay.setDay(date.get(Calendar.DATE));
return resDay;
}
public static int getIndexOfCurrDay(int CalendarType) {
List<CalendarDay> items;
CalendarDay day = getCurrDay();
if (CalendarType == State.VIEW_MONTH || CalendarType == State.VIEW_FULL) {
items = generateItemForMonthView(day.getYear(), day.getMonth());
} else {
items = generateItemForWeekView(day.getYear(), day.getMonth(), day.getDay());
}
return items.indexOf(day);
}
/**
* day
*
* @param day CalendarDay
* @return int
*/
public static int getWeekOfMonth(CalendarDay day) {
Calendar date = Calendar.getInstance();
date.set(day.getYear(), day.getMonth(), day.getDay(), 12, 0);
return date.get(Calendar.WEEK_OF_MONTH);
}
/**
* , directory
*
* @param child View
* @param dy
* @param minOffset
* @param maxOffset
* @return void
*/
public static int scroll(View child, int dy, int minOffset, int maxOffset) {
Log.i(TAG, "scroll: scrolling in viewTools");
final int initOffset = child.getTop();
int offset = calcOffset(initOffset - dy, minOffset, maxOffset) - initOffset;
child.offsetTopAndBottom(offset);
return -offset;
}
/**
*
*
* @param offset
* @param min
* @param max
* @return int offset
*/
private static int calcOffset(int offset, int min, int max) {
if (offset > max) {
return max;
} else return Math.max(offset, min);
}
/**
* scrollTo使ViewCompat.postOnAnimation
*
* @param parent parent
* @param child child
* @param y y
* @param duration
*/
public static void scrollTo(final CoordinatorLayout parent, final RecyclerView child, final int y, int duration) {
final Scroller scroller = new Scroller(parent.getContext());
int top = CalendarAttr.getRecTop();
scroller.startScroll(0, top, 0, y - top, duration); //设置scroller的滚动偏移量
ViewCompat.postOnAnimation(child, new Runnable() {
@Override
public void run() {
//返回值为booleantrue说明滚动尚未完成false说明滚动已经完成。
// 这是一个很重要的方法通常放在View.computeScroll()中,用来判断是否滚动是否结束。
if (scroller.computeScrollOffset()) {
int delta = scroller.getCurrY() - child.getTop();
child.offsetTopAndBottom(delta);
CalendarAttr.setRecTop(child.getTop());
parent.dispatchDependentViewsChanged(child);
ViewCompat.postOnAnimation(child, this);
}
}
});
}
/**
* TouchSlop
*
* @param context
* @return int touchSlop
*/
public static int getTouchSlop(Context context) {
return ViewConfiguration.get(context).getScaledTouchSlop();
}
public static void forceStopRecyclerViewScroll(RecyclerView mRecyclerView) {
mRecyclerView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0));
}
@SuppressLint("SimpleDateFormat")
public static String getTimeForZone() {
Calendar date = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("MM-dd HH:mm:ss a");
Date time = date.getTime();
return sdf.format(time);
}
}

@ -0,0 +1,272 @@
package com.idealist.calendarview;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import com.idealist.calendarview.interf.OnSelectDateListener;
import java.util.ArrayList;
import java.util.List;
public class CalendarView extends View implements View.OnLongClickListener {
private CalendarViewAdapter adapter;
private CalendarAttr attr;
private int mItemHeight;
private int mItemWidth;
private int mViewHeight;
private int mBaseLine;
private boolean isClick;
private boolean isScroll;
private int mTextSize;
private int mCurrItem;
private int mRowCount;
MotionEvent event;
/**
*
*/
private float mX, mY;
private List<CalendarDay> items = new ArrayList<>();
private CalendarDay seedDay;
private OnSelectDateListener onSelectDateListener;
private OnCalendarClickListener clickListener;
public CalendarView(Context context,
CalendarAttr attr,
CalendarViewAdapter adapter,
OnSelectDateListener onSelectDateListener,
OnCalendarClickListener clickListener) {
super(context);
this.attr = attr;
this.adapter = adapter;
this.clickListener = clickListener;
this.onSelectDateListener = onSelectDateListener;
this.setOnLongClickListener(this);
initView();
}
/**
* View
*/
private void initView() {
mRowCount = attr.getRowCount();
mViewHeight = attr.getViewHeight();
mItemHeight = attr.getItemHeight();
mTextSize = attr.getTextSize();
mBaseLine = (int) (mTextSize + mItemHeight) / 2;
mCurrItem = CalendarUtils.getIndexOfCurrDay(State.VIEW_MONTH);
}
/**
* , SeedDay
*/
final int generateItem() {
if (attr.getCalendarType() != State.VIEW_WEEK)
items = CalendarUtils.generateItemForMonthView(seedDay.getYear(), seedDay.getMonth());
else
items = CalendarUtils.generateItemForWeekView(seedDay.getYear(), seedDay.getMonth(), seedDay.getDay());
return items.indexOf(seedDay);
}
/**
* UI
*/
public void changeViewType() {
if (attr.getCalendarType() == State.VIEW_FULL) {
attr.setItemHeight(State.DEFAULT_ITEM_HEIGHT_FULL);
} else {
attr.setItemHeight(State.DEFAULT_ITEM_HEIGHT);
}
mItemHeight = attr.getItemHeight();
mViewHeight = attr.getViewHeight();
setViewHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mCurrItem = generateItem();
invalidate();
}
public void updateView() {
mCurrItem = generateItem();
invalidate();
}
public CalendarDay getSeedDay() {
return seedDay;
}
public void setSeedDay(CalendarDay seedDay) {
this.seedDay = seedDay;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (attr.getCalendarType() != State.VIEW_FULL) {
setMeasuredDimension(widthMeasureSpec, mViewHeight);
}
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
int action = event.getAction();
float disX, disY;
switch (action) {
case MotionEvent.ACTION_DOWN:
mX = touchX;
mY = touchY;
isClick = true;
break;
case MotionEvent.ACTION_MOVE:
disX = touchX - mX;
disY = touchY - mY;
if (Math.abs(disX) > 2 * mItemWidth || Math.abs(disY) > 2 * mItemHeight) {
isScroll = true;
}
isClick = false;
break;
case MotionEvent.ACTION_UP:
if (isClick) {
items.get(mCurrItem).setSelectState(State.DAY_UN_SELECT);
mCurrItem = getIndexOnView();
adapter.setSelectDay(items.get(mCurrItem));
if (items.get(mCurrItem).getMonthState() != State.DAY_CURR_MONTH) {
items.get(mCurrItem).setSelectState(State.DAY_UN_SELECT);
onSelectDateListener.onSelectOtherMonth(items.get(mCurrItem).getMonthState());
mCurrItem = 0;
} else {
items.get(mCurrItem).setSelectState(State.DAY_SELECT);
}
if (adapter.getSelectDay().isMarkSchedule()) {
clickListener.OnClick(adapter.getSelectDay());
}
invalidate();
}
break;
}
return super.onTouchEvent(event);
}
public List<CalendarDay> getItems() {
return items;
}
public void setItems(List<CalendarDay> items) {
this.items = items;
}
public void setmCurrItem(int mCurrItem) {
this.mCurrItem = mCurrItem;
}
private int getIndexOnView() {
int indexX = (int) mX / mItemWidth;
int indexY = (int) mY / mItemHeight;
int position = -1;
if (isClick) {
if (indexX > 6) indexX = 6;
position = 7 * indexY + indexX;
}
if (position > 41)
position = 41;
return position;
}
@Override
protected void onDraw(Canvas canvas) {
mItemWidth = getWidth() / 7;
mItemHeight = attr.getItemHeight();
mRowCount = attr.getRowCount();
mBaseLine = (int) (mTextSize * 1.5);
int sW = mItemWidth / 2;
int sH = mBaseLine;
for (int i = 0; i < mRowCount; ++i) {
for (int j = 0; j < 7; ++j) {
draw(canvas, items.get(7 * i + j), sW + mItemWidth * j, sH + mItemHeight * i);
}
}
}
private void draw(Canvas canvas, CalendarDay day, int x, int y) {
onDrawText(canvas, day, x, y);
onDrawMark(canvas, day, x, y);
}
private void onDrawText(Canvas canvas, CalendarDay day, int x, int y) {
Paint paint = new Paint();
paint.setTextSize(mTextSize);
paint.setColor(Color.GRAY);
paint.setTextAlign(Paint.Align.CENTER);
// Log.e("View", day.toString());
if (day.isCurrDay()) {
paint.setColor(Color.BLUE);
} else if (day.getSelectState() == State.DAY_SELECT) {
paint.setColor(Color.GREEN);
} else if (day.getMonthState() == State.DAY_CURR_MONTH) {
paint.setColor(Color.BLACK);
}
canvas.drawText(Integer.toString(day.getDay()), x, y, paint);
}
private void onDrawMark(Canvas canvas, CalendarDay day, int x, int y) {
if (day.isMarkSchedule()) {
Paint paint = new Paint();
paint.setColor(Color.BLUE);
canvas.drawCircle(x, y+20, 10, paint);
}
}
/**
* View
*
* @param height
*/
private void setViewHeight(int height) {
Log.e(null, "setViewHeight");
ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) this.getLayoutParams();
params.height = height;
this.setLayoutParams(params);
}
@Override
public boolean onLongClick(View v) {
if (clickListener != null) {
clickListener.OnLongClick(adapter.getSelectDay());
}
return false;
}
public interface OnCalendarClickListener {
void OnClick(CalendarDay day);
void OnLongClick(CalendarDay day);
}
}

@ -0,0 +1,188 @@
package com.idealist.calendarview;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import com.idealist.calendarview.interf.OnSelectDateListener;
import java.util.ArrayList;
import java.util.List;
public class CalendarViewAdapter extends PagerAdapter {
private CalendarAttr attr;
private List<CalendarView> mViews = new ArrayList<>();
private int mCurrPosition = CalendarPager.CURRENT_DAY_INDEX;
// 保存上一次点击的日期
private static CalendarDay mRecDate;
private CalendarDay mSelectDay;
private OnCalendarTypeChangeListener typeChangeListener;
public CalendarViewAdapter(Context context, CalendarAttr attr,
OnSelectDateListener dateListener,
CalendarView.OnCalendarClickListener longClickListener) {
super();
this.attr = attr;
initViewAdapter(context, dateListener, longClickListener);
}
private void initViewAdapter(Context context, OnSelectDateListener dateListener,
CalendarView.OnCalendarClickListener longClickListener) {
mSelectDay = CalendarUtils.getCurrDay();
CalendarDay day;
for (int i = 0; i < 3; i++) {
CalendarView view = new CalendarView(context, attr, this, dateListener, longClickListener);
day = CalendarUtils.getNearMonthDay(mSelectDay, i - 1);
view.setSeedDay(day);
mViews.add(view);
}
}
/**
* View
*
* @param position View position
*/
public void updateViewByScrollHorizontally(int position) {
Log.e("adapter", "position: " + position + " mCurrPosition: " + mCurrPosition);
CalendarDay seedDay = mViews.get(position % 3).getSeedDay();
int offset = 0;
if (position > mCurrPosition) {
offset = 1;
} else if (position < mCurrPosition) {
offset = -1;
}
CalendarView view = mViews.get((position + offset) % 3);
//TODO 注意视图
if (attr.getCalendarType() != State.VIEW_WEEK)
view.setSeedDay(CalendarUtils.getNearMonthDay(seedDay, offset));
else
view.setSeedDay(CalendarUtils.getNearWeekDay(seedDay, offset));
}
public int getCalendarType() {
return attr.getCalendarType();
}
/**
* View
*
* @param updateType
*/
public void changeCalendarType(int updateType) {
attr.setCalendarType(updateType);
CalendarDay seedDay = mViews.get(mCurrPosition % 3).getSeedDay();
saveSelectedDate();
for (int i = -1; i < 2; ++i) {
CalendarView view = mViews.get((mCurrPosition + i) % 3);
if (updateType == State.VIEW_WEEK) {
view.setSeedDay(CalendarUtils.getNearWeekDay(mSelectDay, i));
} else {
view.setSeedDay(CalendarUtils.getNearMonthDay(mSelectDay, i));
}
view.changeViewType();
}
}
// /**
// * 由 pager 通知 adapter 发生点击事件更改,进行处理
// * @param day 选中 CalendarDay
// */
// public void notifyDataChanged() {
//
// }
public void saveSelectedDate() {
mRecDate = mSelectDay;
}
public static CalendarDay loadSelectedDate() {
return mRecDate;
}
@Override
public int getCount() {
// 实现无限循环
return Integer.MAX_VALUE;
}
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.setPrimaryItem(container, position % 3, object);
this.mCurrPosition = position;
Log.e("adapterPri", Integer.toString(position));
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
// if (position < 2) return null;
CalendarView view = mViews.get(position % 3);
view.generateItem();
view.invalidate();
int mChildNum = container.getChildCount();
if (mChildNum == mViews.size()) {
container.removeView(view);
}
if (container.getChildCount() < mViews.size()) {
container.addView(view, 0);
} else {
container.addView(view, position % 3);
}
return view;
}
public void updateDayInViewState(int position) {
CalendarView view = mViews.get(position % 3);
view.setSeedDay(mSelectDay);
view.updateView();
}
public void updateViewScheduleChange() {
CalendarView view = mViews.get(mCurrPosition % 3);
view.updateView();
}
public void setTypeChangeListener(OnCalendarTypeChangeListener typeChangeListener) {
this.typeChangeListener = typeChangeListener;
}
public CalendarDay getSelectDay() {
return mSelectDay;
}
public void setSelectDay(CalendarDay mSelectDay) {
this.mSelectDay = mSelectDay;
}
public List<CalendarView> getViews() {
return mViews;
}
public interface OnCalendarTypeChangeListener {
void onCalendarTypeChanged(int Calendar_Type);
}
@Override
public boolean isViewFromObject(@NonNull android.view.View view, @NonNull Object object) {
return view == ((View) object);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
}
}

@ -0,0 +1,66 @@
package com.idealist.calendarview;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.diary.database.utils.ScheduleSQLUtils;
import java.util.ArrayList;
import java.util.List;
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements
View.OnClickListener{
private List<String> mDatabase;
private OnItemClickListener onItemClickListener = null;
public RecyclerViewAdapter(List<String> mDatabase) {
super();
this.mDatabase = mDatabase;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(parent.getContext(), R.layout.schedule_item, null);
view.setOnClickListener(this);
return new RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (!(holder instanceof RecyclerViewHolder))
return;
holder.itemView.setTag(position);
String text = mDatabase.get(position);
((RecyclerViewHolder) holder).timeTextView.setText(ScheduleSQLUtils.extractScheduleTime(text));
((RecyclerViewHolder) holder).titleTextView.setText(ScheduleSQLUtils.extractScheduleName(text));
}
@Override
public int getItemCount() {
return mDatabase.size();
}
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(v, (int) v.getTag());
}
}
public void setmDatabase(List<String> mDatabase) {
this.mDatabase = mDatabase;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
}

@ -0,0 +1,141 @@
package com.idealist.calendarview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.ViewPager;
import static android.content.ContentValues.TAG;
public class RecyclerViewBehavior extends CoordinatorLayout.Behavior<RecyclerView> {
private int initOffset = -1;
private int minOffset = -1;
private int bottomOffset = -1;
private Context context;
private boolean initiated = false;
boolean hidingTop = false;
boolean showingTop = false;
public RecyclerViewBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
@Override
public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull RecyclerView child, int layoutDirection) {
parent.onLayoutChild(child, layoutDirection);
CalendarPager calendarPager = getCalendarPager(parent);
initMinOffsetAndInitOffset(parent, child, calendarPager);
return true;
}
private void initMinOffsetAndInitOffset(CoordinatorLayout parent, RecyclerView child, CalendarPager pager) {
if (pager.getBottom() > 0 && initOffset == -1) {
initOffset = pager.getMeasuredHeight();
CalendarAttr.setRecTop(initOffset);
}
if (pager.getBottom() > 0 && bottomOffset == -1) {
bottomOffset = State.DEFAULT_ITEM_HEIGHT_FULL * 6;
}
if (!initiated) {
initOffset = pager.getMeasuredHeight();
CalendarAttr.setRecTop(initOffset);
initiated = true;
}
child.offsetTopAndBottom(CalendarAttr.getRecTop());
minOffset = getCalendarPager(parent).getItemHeight();
}
@Override
public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull RecyclerView child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) {
return (axes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}
@Override
public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull RecyclerView child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
child.setVerticalScrollBarEnabled(true);
CalendarPager pager = (CalendarPager) coordinatorLayout.getChildAt(0);
if (pager.getPageScrollState() != ViewPager.SCROLL_STATE_IDLE) {
consumed[1] = dy;
Log.w("ldf", "onNestedPreScroll: MonthPager dragging");
Toast.makeText(context, "loading month data", Toast.LENGTH_SHORT).show();
return;
}
// 上滑,正在隐藏顶部的日历
hidingTop = dy > 0;
// 下滑,正在展示顶部的日历
showingTop = dy < 0 && !target.canScrollVertically(-1);
Log.i("recycleBehavior", "hidingTop: " + hidingTop + " showingTop: " + showingTop);
if (hidingTop || showingTop) {
if (pager.getScrollLevel() == State.LEVEL_TOP) {
consumed[1] = CalendarUtils.scroll(child, dy,
State.DEFAULT_ITEM_HEIGHT,
State.DEFAULT_ITEM_HEIGHT * 6 + 10);
} else if (pager.getScrollLevel() == State.LEVEL_MEDIUM) {
consumed[1] = CalendarUtils.scroll(child, dy,
State.DEFAULT_ITEM_HEIGHT,
State.DEFAULT_ITEM_HEIGHT_FULL * 6);
}
CalendarAttr.setRecTop(child.getTop());
}
}
@Override
public void onStopNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull RecyclerView child, @NonNull View target, int type) {
super.onStopNestedScroll(coordinatorLayout, child, target, type);
CalendarPager pager = (CalendarPager) getCalendarPager(coordinatorLayout);
CalendarViewAdapter adapter = (CalendarViewAdapter) pager.getAdapter();
if (pager.getScrollLevel() == State.LEVEL_TOP) {
if (CalendarAttr.getRecTop() - minOffset > CalendarUtils.getTouchSlop(context) && showingTop
&& CalendarAttr.getRecTop() < initOffset + 110) {
pager.setScrollLevel(State.LEVEL_MEDIUM);
adapter.changeCalendarType(State.VIEW_MONTH);
CalendarUtils.scrollTo(coordinatorLayout, child, getCalendarPager(coordinatorLayout).getViewHeight(), 500);
CalendarUtils.forceStopRecyclerViewScroll(child);
} else {
CalendarUtils.scrollTo(coordinatorLayout, child, getCalendarPager(coordinatorLayout).getItemHeight(), 150);
}
} else if (pager.getScrollLevel() == State.LEVEL_MEDIUM) {
if (initOffset - CalendarAttr.getRecTop() > CalendarUtils.getTouchSlop(context) && hidingTop) {
pager.setScrollLevel(State.LEVEL_TOP);
adapter.changeCalendarType(State.VIEW_WEEK);
CalendarUtils.scrollTo(coordinatorLayout, child, getCalendarPager(coordinatorLayout).getItemHeight(), 500);
CalendarUtils.forceStopRecyclerViewScroll(child);
} else if (CalendarAttr.getRecTop() - initOffset > CalendarUtils.getTouchSlop(context) && showingTop) {
pager.setScrollLevel(State.LEVEL_BOTTOM);
adapter.changeCalendarType(State.VIEW_FULL);
CalendarUtils.scrollTo(coordinatorLayout, child, getCalendarPager(coordinatorLayout).getViewHeight(), 500);
CalendarUtils.forceStopRecyclerViewScroll(child);
} else {
CalendarUtils.scrollTo(coordinatorLayout, child, getCalendarPager(coordinatorLayout).getViewHeight(), 150);
}
}
}
@Override
public boolean onNestedFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull RecyclerView child, @NonNull View target, float velocityX, float velocityY, boolean consumed) {
return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
}
@Override
public boolean onNestedPreFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull RecyclerView child, @NonNull View target, float velocityX, float velocityY) {
return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
}
private CalendarPager getCalendarPager(CoordinatorLayout parent) {
return (CalendarPager) parent.getChildAt(0);
}
}

@ -0,0 +1,20 @@
package com.idealist.calendarview;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
public TextView timeTextView;
public TextView titleTextView;
public RecyclerViewHolder(@NonNull View itemView) {
super(itemView);
timeTextView = itemView.findViewById(R.id.schedule_time);
titleTextView = itemView.findViewById(R.id.schedule_title);
}
}

@ -0,0 +1,30 @@
package com.idealist.calendarview;
import android.graphics.Rect;
import android.view.View;
import androidx.recyclerview.widget.RecyclerView;
import java.util.HashMap;
public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
private int mSpace;
public SpaceItemDecoration(int mSpace) {
this.mSpace = mSpace;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.left = mSpace;
outRect.right = mSpace;
outRect.bottom = mSpace;
if (parent.getChildAdapterPosition(view) == 0) {
outRect.top = mSpace;
}
}
}

@ -0,0 +1,36 @@
package com.idealist.calendarview;
public final class State {
public static final int DAY_UN_SELECT = 0;
public static final int DAY_SELECT = 1;
public static final int DAY_CURR_MONTH = 0;
public static final int DAY_PAST_MONTH = -1;
public static final int DAY_NEXT_MONTH = 1;
public static final int VIEW_WEEK = 1;
public static final int VIEW_MONTH = 2;
public static final int VIEW_FULL = 3;
public static final int LEVEL_TOP = 1;
public static final int LEVEL_MEDIUM = 2;
public static final int LEVEL_BOTTOM = 3;
public static final int DEFAULT_ITEM_HEIGHT = 180;
public static final int DEFAULT_TEXT_SIZE = 80;
public static int DEFAULT_ITEM_HEIGHT_FULL;
public static void setDefaultItemHeightFull(int defaultItemHeightFull) {
DEFAULT_ITEM_HEIGHT_FULL = defaultItemHeightFull;
}
}

@ -0,0 +1,7 @@
package com.idealist.calendarview.interf;
import com.idealist.calendarview.CalendarDay;
public interface OnSelectDateListener {
void onSelectOtherMonth(int offset);//点击其它月份日期
}

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#000000"/>
</shape>
</item>
<item
android:left="1dp">
<shape>
<solid android:color="#ffffff"/>
</shape>
</item>
</layer-list>

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="10dp"
android:paddingEnd="10dp">
<TextView
android:id="@+id/schedule_time"
android:layout_width="40dp"
android:layout_height="match_parent"
android:text="1:00\n7:00"
android:textSize="14sp"
android:gravity="center"/>
<TextView
android:id="@+id/schedule_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:layout_toEndOf="@+id/schedule_time"
android:layout_toRightOf="@+id/schedule_time"
android:gravity="center_vertical"
android:paddingLeft="20dp"
android:text="schedule"
android:textSize="24sp"
android:textStyle="bold"
android:background="@drawable/schedule_border"/>
</RelativeLayout>
</LinearLayout>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="item_height" format="dimension"/>
<attr name="text_size" format="dimension"/>
</declare-styleable>
</resources>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="weekIndicatorStyle">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center</item>
<item name="android:textSize">13sp</item>
<item name="android:textColor">#ff25adff</item>
</style>
</resources>

@ -0,0 +1,17 @@
package com.idealist.calendarview;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-15/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Database</name>
<comment>Project Database created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1625906374715</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

@ -0,0 +1,2 @@
connection.project.dir=..
eclipse.preferences.version=1

@ -0,0 +1,38 @@
plugins {
id 'com.android.library'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
minSdkVersion 17
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

@ -0,0 +1,26 @@
package com.diary.database;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.diary.database.test", appContext.getPackageName());
}
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.diary.database">
</manifest>

@ -0,0 +1,33 @@
package com.diary.database.DatabaseHelper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class CourseSQLHelper extends SQLiteOpenHelper {
private static final String db_name = "course";//自定义的数据库名;
private static final int version = 2;//版本号
public CourseSQLHelper(Context context) {
super(context, db_name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table courses(" +
"id integer primary key autoincrement," +
"course_name text," +
"teacher text," +
"class_room text," +
"day integer," +
"class_start integer," +
"class_end integer," +
"weeks text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists schedules");
onCreate(db);
}
}

@ -0,0 +1,39 @@
package com.diary.database.DatabaseHelper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class ScheduleSQLHelper extends SQLiteOpenHelper {
private static final String db_name = "MySchedule";//自定义的数据库名;
private static final int version = 98889;//版本号
public ScheduleSQLHelper(Context context) {
super(context, db_name, null, version);
}
// 该方法会自动调用首先系统会检查该程序中是否存在数据库名为MySchedule的数据库
// 如果存在则不会执行该方法,如果不存在则会执行该方法。
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table schedules(" +
"id Integer primary key autoincrement," + //id自增,只支持integer不支持int
"scheduleName varchar(50)," +
"schedulePlace varchar(50)," +
"ifSchedulePlace integer," +
"startTime varchar(50)," +
"ifStartTime integer," +
"endTime varchar(50)," +
"ifEndTime interger," +
"time varchar(30)" +
")";
db.execSQL(sql);
}
//数据库版本更新时执行该方法,如果表已存在则先删除再调用onCreate重新创建
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists schedules");
onCreate(db);
}
}

@ -0,0 +1,14 @@
package com.diary.database;
import android.database.sqlite.SQLiteDatabase;
import java.util.List;
public class MySQLiteDatabase {
public static SQLiteDatabase scheduleSQL;
public static SQLiteDatabase courseSQL;
public static SQLiteDatabase zoneSQL;
}

@ -0,0 +1,10 @@
package com.diary.database.utils;
import android.database.sqlite.SQLiteDatabase;
import com.diary.database.MySQLiteDatabase;
public class CourseSQLUtils {
private static SQLiteDatabase courseSQL = MySQLiteDatabase.courseSQL;
}

@ -0,0 +1,69 @@
package com.diary.database.utils;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.diary.database.MySQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
public class ScheduleSQLUtils {
private static SQLiteDatabase database = MySQLiteDatabase.scheduleSQL;
public static List<String> queryByDate(String date) {
//columns为null 查询所有列
List<String> res = new ArrayList<>();
String aScheduleName;
Cursor cursor = database.query("schedules",null,"time=?",new String[]{date},null,null,null);
if(cursor.moveToFirst()){
int scheduleCount = 0;
do{
aScheduleName = cursor.getString(cursor.getColumnIndex("scheduleName"));
String aStartTime = cursor.getString(cursor.getColumnIndex("startTime"));
Integer ifStartTime = cursor.getInt(cursor.getColumnIndex("ifStartTime"));
String aEndTime = cursor.getString(cursor.getColumnIndex("endTime"));
Integer ifEndTime = cursor.getInt(cursor.getColumnIndex("ifEndTime"));
String scheduleText = aScheduleName;
if(ifStartTime == 1){
scheduleText += "($时间:"+aStartTime;
if(ifEndTime ==1){
scheduleText += "\n"+aEndTime;
} else {
scheduleText += "\n24:00";
}
} else {
scheduleText += "($时间: 00:00\n24:00";
}
scheduleCount++;
res.add(scheduleText);
}while (cursor.moveToNext());
}
cursor.close();
return res;
}
public static String extractScheduleName(String scheduleText) {
int index = scheduleText.indexOf("($时间:");
if (index != -1) {
return scheduleText.substring(0, index);
}
return null;
}
public static String extractScheduleTime(String scheduleText) {
int index = scheduleText.indexOf("($时间:");
if (index != -1) {
return scheduleText.substring(index+5);
}
return null;
}
public static boolean isScheduleMarked(String date) {
Cursor cursor = database.query("schedules",null,"time=?",new String[]{date},null,null,null);
return cursor.moveToFirst();
}
}

@ -0,0 +1,17 @@
package com.diary.database;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-15/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

@ -0,0 +1 @@
/build

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>app</name>
<comment>Project app created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1625906374719</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

@ -0,0 +1,2 @@
connection.project.dir=..
eclipse.preferences.version=1

@ -0,0 +1,46 @@
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.diary.showme"
minSdkVersion 17
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'cc.trity.floatingactionbutton:library:1.0.0'
implementation 'org.greenrobot:eventbus:3.0.0'
implementation 'com.chanven.lib:cptr:1.1.0'
implementation 'com.jakewharton:butterknife:8.0.1'
implementation project(path: ':Database')
implementation project(path: ':CalendarView')
annotationProcessor 'com.jakewharton:butterknife-compiler:8.0.1'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

@ -0,0 +1,18 @@
{
"version": 2,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.diary.showme",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"versionCode": 1,
"versionName": "1.0",
"outputFile": "app-release.apk"
}
]
}

@ -0,0 +1,26 @@
package com.diary.showme;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.diary.showme", appContext.getPackageName());
}
}

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.diary.showme">
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Showme">
<activity android:name=".diary.ui.UpdateDiaryActivity" />
<activity android:name=".diary.ui.DiaryActivity" />
<activity android:name=".diary.ui.AddDiaryActivity" />
<activity android:name=".diary.ui.CardActivity" />
<activity android:name=".diary.ui.QuestionActivity"/>
<activity android:name=".Course.AddCourseActivity" />
<activity android:name=".Course.CourseActivity" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Schedule.AddScheduleActivity" />
<activity android:name=".Schedule.EditScheduleActivity" />
</application>
</manifest>

@ -0,0 +1,56 @@
package com.diary.showme.Course;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.diary.showme.R;
public class AddCourseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course);
setFinishOnTouchOutside(false);
final EditText inputCourseName = (EditText) findViewById(R.id.course_name);
final EditText inputTeacher = (EditText) findViewById(R.id.teacher_name);
final EditText inputClassRoom = (EditText) findViewById(R.id.class_room);
final EditText inputDay = (EditText) findViewById(R.id.week);
final EditText inputStart = (EditText) findViewById(R.id.classes_begin);
final EditText inputEnd = (EditText) findViewById(R.id.classes_ends);
final EditText inputWeeks = (EditText) findViewById(R.id.weeks);
Button okButton = (Button) findViewById(R.id.button);
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String courseName = inputCourseName.getText().toString();
String teacher = inputTeacher.getText().toString();
String classRoom = inputClassRoom.getText().toString();
String day = inputDay.getText().toString();
String start = inputStart.getText().toString();
String end = inputEnd.getText().toString();
String weeks = inputWeeks.getText().toString();
if (courseName.equals("") || day.equals("") || start.equals("") || end.equals("")) {
Toast.makeText(AddCourseActivity.this, "基本课程信息未填写", Toast.LENGTH_SHORT).show();
} else {
Course course = new Course(courseName, teacher, classRoom,
Integer.valueOf(day), Integer.valueOf(start), Integer.valueOf(end), weeks);
Intent intent = new Intent(AddCourseActivity.this, CourseActivity.class);
intent.putExtra("course", course);
setResult(Activity.RESULT_OK, intent);
finish();
}
}
});
}
}

@ -0,0 +1,81 @@
package com.diary.showme.Course;
import java.io.Serializable;
public class Course implements Serializable {
private String courseName;
private String teacher;
private String classRoom;
private int day;
private int classStart;
private int classEnd;
private String weeks;
public Course(String courseName, String teacher, String classRoom, int day, int classStart, int classEnd, String weeks) {
this.courseName = courseName;
this.teacher = teacher;
this.classRoom = classRoom;
this.day = day;
this.classStart = classStart;
this.classEnd = classEnd;
this.weeks = weeks;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
public String getClassRoom() {
return classRoom;
}
public void setClassRoom(String classRoom) {
this.classRoom = classRoom;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getStart() {
return classStart;
}
public void setStart(int classStart) {
this.classEnd = classStart;
}
public int getEnd() {
return classEnd;
}
public void setEnd(int classEnd) {
this.classEnd = classEnd;
}
public String getWeeks() {
return weeks;
}
public void setWeeks(String weeks) {
this.weeks = weeks;
}
}

@ -0,0 +1,171 @@
package com.diary.showme.Course;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.diary.database.DatabaseHelper.CourseSQLHelper;
import com.diary.database.utils.CourseSQLUtils;
import com.diary.showme.R;
import java.util.ArrayList;
public class CourseActivity extends AppCompatActivity {
private RelativeLayout day;
private Button addCourse;
private Button backToCalendar;
//SQLite Helper类
private CourseSQLHelper databaseHelper = new CourseSQLHelper(this);
int currentCoursesNumber = 0;
int maxCoursesNumber = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_course);
//从数据库读取数据
addCourse = findViewById(R.id.add_courses);
backToCalendar = findViewById(R.id.back_to_calendar);
addCourse.setOnClickListener(v -> {
Intent intent = new Intent(CourseActivity.this, AddCourseActivity.class);
startActivityForResult(intent, 0);
});
backToCalendar.setOnClickListener(v -> finish());
loadData();
}
private void loadData() {
ArrayList<Course> coursesList = new ArrayList<>(); //课程列表
SQLiteDatabase courseSQL = databaseHelper.getReadableDatabase();
Cursor cursor = courseSQL.rawQuery("select * from courses", null);
if (cursor.moveToFirst()) {
do {
coursesList.add(new Course(
cursor.getString(cursor.getColumnIndex("course_name")),
cursor.getString(cursor.getColumnIndex("teacher")),
cursor.getString(cursor.getColumnIndex("class_room")),
cursor.getInt(cursor.getColumnIndex("day")),
cursor.getInt(cursor.getColumnIndex("class_start")),
cursor.getInt(cursor.getColumnIndex("class_end")),
cursor.getString(cursor.getColumnIndex("weeks"))));
} while(cursor.moveToNext());
}
cursor.close();
//使用从数据库读取出来的课程信息来加载课程表视图
for (Course course : coursesList) {
createLeftView(course);
createItemCourseView(course);
}
}
//创建"第几节数"视图
private void createLeftView(Course course) {
int endNumber = course.getEnd();
if (endNumber > maxCoursesNumber) {
for (int i = 0; i < endNumber-maxCoursesNumber; i++) {
View view = LayoutInflater.from(this).inflate(R.layout.course_left_view, null);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(110,180);
view.setLayoutParams(params);
TextView text = view.findViewById(R.id.class_number_text);
text.setText(String.valueOf(++currentCoursesNumber));
LinearLayout leftViewLayout = findViewById(R.id.left_view_layout);
leftViewLayout.addView(view);
}
maxCoursesNumber = endNumber;
}
}
//创建单个课程视图
private void createItemCourseView(final Course course) {
int getDay = course.getDay();
if ((getDay < 1 || getDay > 7) || course.getStart() > course.getEnd())
Toast.makeText(this, "星期几没写对,或课程结束时间比开始时间还早~~", Toast.LENGTH_LONG).show();
else {
int dayId = 0;
switch (getDay) {
case 1: dayId = R.id.monday; break;
case 2: dayId = R.id.tuesday; break;
case 3: dayId = R.id.wednesday; break;
case 4: dayId = R.id.thursday; break;
case 5: dayId = R.id.friday; break;
case 6: dayId = R.id.saturday; break;
case 7: dayId = R.id.weekday; break;
}
day = findViewById(dayId);
int height = 180;
final View v = LayoutInflater.from(this).inflate(R.layout.course_card, null); //加载单个课程布局
v.setY(height * (course.getStart()-1)); //设置开始高度,即第几节课开始
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
(ViewGroup.LayoutParams.MATCH_PARENT,(course.getEnd()-course.getStart()+1)*height - 8); //设置布局高度,即跨多少节课
v.setLayoutParams(params);
TextView text = v.findViewById(R.id.text_view);
text.setText(course.getCourseName() + "\n" + course.getTeacher() + "\n" + course.getClassRoom() + "\n" + course.getWeeks() ); //显示课程名
day.addView(v);
//长按删除课程
v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
v.setVisibility(View.GONE);//先隐藏
day.removeView(v);//再移除课程视图
SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();
sqLiteDatabase.execSQL("delete from courses where course_name = ?", new String[] {course.getCourseName()});
return true;
}
});
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == Activity.RESULT_OK && data != null) {
Course course = (Course) data.getSerializableExtra("course");
//创建课程表左边视图(节数)
createLeftView(course);
//创建课程表视图
createItemCourseView(course);
//存储数据到数据库
saveData(course);
}
}
//保存数据到数据库
private void saveData(Course course) {
SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();
sqLiteDatabase.execSQL
("insert into courses(course_name, teacher, class_room, day, class_start, class_end, weeks) " + "values(?, ?, ?, ?, ?, ?, ?)",
new String[] {course.getCourseName(),
course.getTeacher(),
course.getClassRoom(),
course.getDay()+"",
course.getStart()+"",
course.getEnd()+"",
course.getWeeks()}
);
}
}

@ -0,0 +1,225 @@
package com.diary.showme;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.diary.database.DatabaseHelper.CourseSQLHelper;
import com.diary.database.DatabaseHelper.ScheduleSQLHelper;
import com.diary.database.MySQLiteDatabase;
import com.diary.database.utils.ScheduleSQLUtils;
import com.diary.showme.Course.CourseActivity;
import com.diary.showme.Schedule.AddScheduleActivity;
import com.diary.showme.Schedule.EditScheduleActivity;
import com.diary.showme.diary.ui.QuestionActivity;
import com.diary.showme.diary.ui.DiaryActivity;
import com.idealist.calendarview.CalendarAttr;
import com.idealist.calendarview.CalendarDay;
import com.idealist.calendarview.CalendarPager;
import com.idealist.calendarview.CalendarUtils;
import com.idealist.calendarview.CalendarView;
import com.idealist.calendarview.CalendarViewAdapter;
//import com.idealist.calendarview.RecyclerViewAdapter;
//import com.idealist.calendarview.SpaceItemDecoration;
import com.idealist.calendarview.RecyclerViewAdapter;
import com.idealist.calendarview.SpaceItemDecoration;
import com.idealist.calendarview.State;
import com.idealist.calendarview.interf.OnSelectDateListener;
import java.util.List;
import java.util.TimeZone;
import cc.trity.floatingactionbutton.FloatingActionButton;
public class MainActivity extends AppCompatActivity {
private TextView tvMonth;
private TextView tvYear;
private CalendarDay currentDay;
private CalendarView currentView;
private CalendarPager pager;
private RecyclerView schedule;
private CalendarViewAdapter viewAdapter;
private CalendarAttr attr;
private OnSelectDateListener onSelectDateListener;
private CalendarView.OnCalendarClickListener clickListener;
private FloatingActionButton scheduleFAB, courseFAB, diaryFAB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
int height = dm.heightPixels;
State.setDefaultItemHeightFull((height - 42 - 3*State.DEFAULT_ITEM_HEIGHT) / 6);
initSQL();
initCalendar();
initFAB();
initCourseB();
initDiaryB();
attr = new CalendarAttr();
attr.setCalendarType(State.VIEW_MONTH);
attr.setScrollLevel(State.LEVEL_MEDIUM);
initListener();
viewAdapter = new CalendarViewAdapter(this, attr, onSelectDateListener,
clickListener);
initPager();
initSchedule();
}
private void initSQL() {
ScheduleSQLHelper myScheduleSQLHelper = new ScheduleSQLHelper(this);
SQLiteDatabase scheduleSQL = myScheduleSQLHelper.getWritableDatabase();
CourseSQLHelper myCourseSQLHelper = new CourseSQLHelper(this);
SQLiteDatabase courseSQL = myCourseSQLHelper.getWritableDatabase();
MySQLiteDatabase.scheduleSQL = scheduleSQL;
MySQLiteDatabase.courseSQL = courseSQL;
}
private void initFAB() {
scheduleFAB = findViewById(R.id.add_schedule);
scheduleFAB.setOnClickListener(v -> {
Toast.makeText(getApplicationContext(), viewAdapter.getSelectDay().toString(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, AddScheduleActivity.class);
intent.putExtra("date", viewAdapter.getSelectDay().toString());
startActivityForResult(intent, 0);
});
}
private void initCourseB() {
courseFAB = findViewById(R.id.course_entry);
courseFAB.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, CourseActivity.class);
startActivity(intent);
});
}
private void initDiaryB() {
diaryFAB = findViewById(R.id.diary_entry);
diaryFAB.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, DiaryActivity.class);
startActivity(intent);
});
}
private void initCalendar() {
tvMonth = findViewById(R.id.custom_month_view);
tvYear = findViewById(R.id.custom_year_view);
currentDay = CalendarUtils.getCurrDay();
updateCalendar();
}
private void initPager() {
pager = findViewById(R.id.custom_vp);
pager.setAttr(attr);
pager.setAdapter(viewAdapter);
pager.setmOnPageChangeListener(new CalendarPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
currentView = viewAdapter.getViews().get(position % 3);
currentDay = currentView.getSeedDay();
updateCalendar();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void initListener() {
onSelectDateListener = offset -> pager.selectOtherMonth(offset);
clickListener = new CalendarView.OnCalendarClickListener() {
@Override
public void OnClick(CalendarDay day) {
updateSchedule(day);
}
@Override
public void OnLongClick(CalendarDay day) {
Intent intent = new Intent(MainActivity.this, QuestionActivity.class);
intent.putExtra("date", viewAdapter.getSelectDay().toString());
startActivity(intent);
}
};
}
private void initSchedule() {
schedule = findViewById(R.id.list_item);
List<String> mData = ScheduleSQLUtils.queryByDate(currentDay.toString());
RecyclerViewAdapter adapter = new RecyclerViewAdapter(mData);
adapter.setOnItemClickListener((view, position) -> {
Intent intent = new Intent(MainActivity.this, EditScheduleActivity.class);
intent.putExtra("date", viewAdapter.getSelectDay().toString());
String name = ((TextView) view.findViewById(R.id.schedule_title)).getText().toString();
intent.putExtra("scheduleName", name);
startActivityForResult(intent, 0);
});
schedule.setAdapter(adapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
schedule.setLayoutManager(layoutManager);
schedule.addItemDecoration(new SpaceItemDecoration(30));
}
@SuppressLint("SetTextI18n")
private void updateCalendar() {
tvMonth.setText(currentDay.getMonth() + "");
tvYear.setText(currentDay.getYear() + "");
}
private void updateSchedule(CalendarDay day) {
ScheduleSQLUtils.queryByDate(day.toString());
List<String> mData = ScheduleSQLUtils.queryByDate(day.toString());
RecyclerViewAdapter adapter = (RecyclerViewAdapter) schedule.getAdapter();
adapter.setmDatabase(mData);
adapter.notifyDataSetChanged();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
updateSchedule(viewAdapter.getSelectDay());
viewAdapter.updateViewScheduleChange();
}
}
}

@ -0,0 +1,139 @@
package com.diary.showme.Schedule;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.diary.database.DatabaseHelper.ScheduleSQLHelper;
import com.diary.showme.R;
public class AddScheduleActivity extends AppCompatActivity implements View.OnClickListener{
private EditText scheduleNameInput;
private EditText schedulePlaceInput;
private EditText scheduleStartHourInput;
private EditText scheduleStartMinInput;
private EditText scheduleEndHourInput;
private EditText scheduleEndMinInput;
private Button checkAdd1;
private ScheduleSQLHelper mySQLiteOpenHelper;
private SQLiteDatabase myDatabase;
private Context context;
private TextView mySchedule2;
private String date;
private Integer cnt=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_schedule_add);
initView();
}
private void initView() {
mySQLiteOpenHelper = new ScheduleSQLHelper(this);
myDatabase = mySQLiteOpenHelper.getWritableDatabase();
context = this;
scheduleNameInput = findViewById(R.id.scheduleNameInput);
schedulePlaceInput = findViewById(R.id.schedulePlaceInput);
scheduleStartHourInput = findViewById(R.id.scheduleStartHourInput);
scheduleStartMinInput = findViewById(R.id.scheduleStartMinInput);
scheduleEndHourInput = findViewById(R.id.scheduleEndHourInput);
scheduleEndMinInput = findViewById(R.id.scheduleEndMinInput);
checkAdd1 = findViewById(R.id.checkAdd1);
checkAdd1.setOnClickListener(this);
mySchedule2 = findViewById(R.id.schedule2);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.checkAdd1:
ContentValues values = new ContentValues();
Intent intent = getIntent();
date = intent.getStringExtra("date");
Integer cnt1=0;
if(scheduleNameInput.getText().toString().equals("")){
Toast.makeText(this, "日程标题未填写", Toast.LENGTH_SHORT).show();
}else if((scheduleStartHourInput.getText().toString().equals("") && !scheduleStartMinInput.getText().toString().equals("")) || (!scheduleStartHourInput.getText().toString().equals("") && scheduleStartMinInput.getText().toString().equals(""))){
Toast.makeText(this, "开始时间未填写完全", Toast.LENGTH_SHORT).show();
}else if((scheduleEndHourInput.getText().toString().equals("") && !scheduleEndMinInput.getText().toString().equals("")) || (!scheduleEndHourInput.getText().toString().equals("") && scheduleEndMinInput.getText().toString().equals(""))){
Toast.makeText(this, "结束时间未填写完全", Toast.LENGTH_SHORT).show();
}else if(!scheduleStartHourInput.getText().toString().equals("") && !scheduleStartMinInput.getText().toString().equals("") && !scheduleEndHourInput.getText().toString().equals("") && !scheduleEndMinInput.getText().toString().equals("")){
if(Integer.parseInt(scheduleEndHourInput.getText().toString())<Integer.parseInt(scheduleStartHourInput.getText().toString())){
Toast.makeText(this, "时间输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleEndHourInput.getText().toString())==Integer.parseInt(scheduleStartHourInput.getText().toString()) && Integer.parseInt(scheduleEndMinInput.getText().toString())<Integer.parseInt(scheduleStartMinInput.getText().toString()) && cnt==0){
Toast.makeText(this, "时间输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleStartHourInput.getText().toString())<0 || Integer.parseInt(scheduleStartHourInput.getText().toString())>24){
Toast.makeText(this, "开始时输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleStartMinInput.getText().toString())<0 || Integer.parseInt(scheduleStartMinInput.getText().toString())>60){
Toast.makeText(this, "开始分输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleEndHourInput.getText().toString())<0 || Integer.parseInt(scheduleEndHourInput.getText().toString())>24){
Toast.makeText(this, "结束时输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleEndMinInput.getText().toString())<0 || Integer.parseInt(scheduleEndMinInput.getText().toString())>60){
Toast.makeText(this, "结束分输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(cnt1==0){
cnt=1;
}
}else{
cnt = 1;
}
if(cnt==1) {
//第一个参数是表中的列名
values.put("scheduleName", scheduleNameInput.getText().toString());
if(schedulePlaceInput.getText().toString().equals("")){
values.put("ifSchedulePlace", 0);
}else {
values.put("ifSchedulePlace", 1);
}
if(scheduleStartHourInput.getText().toString().equals("") && scheduleStartMinInput.getText().toString().equals("")){
values.put("ifStartTime", 0);
}else {
values.put("ifStartTime", 1);
}
if(scheduleEndHourInput.getText().toString().equals("") && scheduleEndMinInput.getText().toString().equals("")){
values.put("ifEndTime", 0);
}else {
values.put("ifEndTime", 1);
}
values.put("schedulePlace", schedulePlaceInput.getText().toString());
values.put("startTime", scheduleStartHourInput.getText().toString() + ":" + scheduleStartMinInput.getText().toString());
values.put("endTime", scheduleEndHourInput.getText().toString() + ":" + scheduleEndMinInput.getText().toString());
values.put("time", date);
myDatabase.insert("schedules", null, values);
// Intent intent2 = new Intent(AddSchedule.this, MainActivity.class);
// startActivity(intent2);
setResult(Activity.RESULT_OK);
finish();
//queryByDate(date);
break;
}
}
}
}

@ -0,0 +1,199 @@
package com.diary.showme.Schedule;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.diary.database.DatabaseHelper.ScheduleSQLHelper;
import com.diary.showme.R;
public class EditScheduleActivity extends AppCompatActivity implements View.OnClickListener{
private Button editBtn,deleteBtn;
private EditText scheduleNameInput;
private EditText schedulePlaceInput;
private EditText scheduleStartHourInput;
private EditText scheduleStartMinInput;
private EditText scheduleEndHourInput;
private EditText scheduleEndMinInput;
private ScheduleSQLHelper mySQLiteOpenHelper;
private SQLiteDatabase myDatabase;
private String scheduleName;
private String date;
private Integer cnt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_schedule_edit);
// 首先获取到意图对象
Intent intent = getIntent();
// 获取到传递过来的姓名
scheduleName = intent.getStringExtra("scheduleName");
//获得时间
date = intent.getStringExtra("date");
initView();
}
private void initView() {
mySQLiteOpenHelper = new ScheduleSQLHelper(this);
myDatabase = mySQLiteOpenHelper.getWritableDatabase();
editBtn = findViewById(R.id.editBtn);
editBtn.setOnClickListener(this);
deleteBtn = findViewById(R.id.deleteSchedule);
deleteBtn.setOnClickListener(this);
Cursor cursor = myDatabase.query("schedules",null,"scheduleName=? and time=?",new String[]{scheduleName,date},null,null,null);
if(cursor.moveToFirst()){
String aScheduleName = cursor.getString(cursor.getColumnIndex("scheduleName"));
String aSchedulePlace = cursor.getString(cursor.getColumnIndex("schedulePlace"));
String aStartTime = cursor.getString(cursor.getColumnIndex("startTime"));
String aEndTime = cursor.getString(cursor.getColumnIndex("endTime"));
Integer ifSchedulePlace = cursor.getInt(cursor.getColumnIndex("ifSchedulePlace"));
Integer ifStartTime = cursor.getInt(cursor.getColumnIndex("ifStartTime"));
Integer ifEndTime = cursor.getInt(cursor.getColumnIndex("ifEndTime"));
String[] aStartTime1; //=aStartTime.split(":");
String[] aEndTime1; //=aEndTime.split(":");
scheduleNameInput = findViewById(R.id.scheduleNameInput);
schedulePlaceInput = findViewById(R.id.schedulePlaceInput);
scheduleStartHourInput = findViewById(R.id.scheduleStartHourInput);
scheduleStartMinInput = findViewById(R.id.scheduleStartMinInput);
scheduleEndHourInput = findViewById(R.id.scheduleEndHourInput);
scheduleEndMinInput = findViewById(R.id.scheduleEndMinInput);
scheduleNameInput.setText(aScheduleName);
if(ifSchedulePlace==1){
schedulePlaceInput.setText(aSchedulePlace);
}
if(ifStartTime == 1) {
aStartTime1=aStartTime.split(":");
scheduleStartHourInput.setText(aStartTime1[0]);
scheduleStartMinInput.setText(aStartTime1[1]);
}
if(ifEndTime == 1) {
aEndTime1=aEndTime.split(":");
scheduleEndHourInput.setText(aEndTime1[0]);
scheduleEndMinInput.setText(aEndTime1[1]);
}
}
}
@Override
public void onClick(View v){
switch (v.getId()){
case R.id.deleteSchedule:
deleteMySchedule();
break;
case R.id.editBtn:
editSchedule();
break;
}
}
private void editSchedule() {
// ContentValues values = new ContentValues();
// values.put("scheduleName",scheduleNameInput.getText().toString());
// values.put("scheduleName",scheduleNameInput.getText().toString());
// values.put("schedulePlace",schedulePlaceInput.getText().toString());
// values.put("startTime",scheduleStartHourInput.getText().toString()+":"+scheduleStartMinInput.getText().toString());
// values.put("endTime",scheduleEndHourInput.getText().toString()+":"+scheduleEndMinInput.getText().toString());
//
// myDatabase.update("schedules",values,"scheduleName=?",new String[]{scheduleName});
//
// Intent intent = new Intent(EditScheduleActivity.this, MainActivity.class);
// startActivity(intent);
ContentValues values = new ContentValues();
Intent intent = getIntent();
Integer cnt1 = 0;
date = intent.getStringExtra("date");
if(scheduleNameInput.getText().toString().equals("")){
Toast.makeText(this, "日程标题未填写", Toast.LENGTH_SHORT).show();
}else if((scheduleStartHourInput.getText().toString().equals("") && !scheduleStartMinInput.getText().toString().equals("")) || (!scheduleStartHourInput.getText().toString().equals("") && scheduleStartMinInput.getText().toString().equals(""))){
Toast.makeText(this, "开始时间未填写完全", Toast.LENGTH_SHORT).show();
}else if((scheduleEndHourInput.getText().toString().equals("") && !scheduleEndMinInput.getText().toString().equals("")) || (!scheduleEndHourInput.getText().toString().equals("") && scheduleEndMinInput.getText().toString().equals(""))){
Toast.makeText(this, "结束时间未填写完全", Toast.LENGTH_SHORT).show();
}else if(!scheduleStartHourInput.getText().toString().equals("") && !scheduleStartMinInput.getText().toString().equals("") && !scheduleEndHourInput.getText().toString().equals("") && !scheduleEndMinInput.getText().toString().equals("")){
if(Integer.parseInt(scheduleEndHourInput.getText().toString())<Integer.parseInt(scheduleStartHourInput.getText().toString())){
Toast.makeText(this, "时间输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleEndHourInput.getText().toString())==Integer.parseInt(scheduleStartHourInput.getText().toString()) && Integer.parseInt(scheduleEndMinInput.getText().toString())<Integer.parseInt(scheduleStartMinInput.getText().toString()) && cnt==0){
Toast.makeText(this, "时间输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleStartHourInput.getText().toString())<0 || Integer.parseInt(scheduleStartHourInput.getText().toString())>24){
Toast.makeText(this, "开始时输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleStartMinInput.getText().toString())<0 || Integer.parseInt(scheduleStartMinInput.getText().toString())>60){
Toast.makeText(this, "开始分输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleEndHourInput.getText().toString())<0 || Integer.parseInt(scheduleEndHourInput.getText().toString())>24){
Toast.makeText(this, "结束时输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(Integer.parseInt(scheduleEndMinInput.getText().toString())<0 || Integer.parseInt(scheduleEndMinInput.getText().toString())>60){
Toast.makeText(this, "结束分输入不合法", Toast.LENGTH_SHORT).show();
cnt1+=1;
}
if(cnt1==0){
cnt=1;
}
}else{
cnt = 1;
}
if(cnt==1) {
//第一个参数是表中的列名
values.put("scheduleName", scheduleNameInput.getText().toString());
if (schedulePlaceInput.getText().toString().equals("")) {
values.put("ifSchedulePlace", 0);
} else {
values.put("ifSchedulePlace", 1);
}
if (scheduleStartHourInput.getText().toString().equals("") && scheduleStartMinInput.getText().toString().equals("")) {
values.put("ifStartTime", 0);
} else {
values.put("ifStartTime", 1);
}
if (scheduleEndHourInput.getText().toString().equals("") && scheduleEndMinInput.getText().toString().equals("")) {
values.put("ifEndTime", 0);
} else {
values.put("ifEndTime", 1);
}
values.put("schedulePlace", schedulePlaceInput.getText().toString());
values.put("startTime", scheduleStartHourInput.getText().toString() + ":" + scheduleStartMinInput.getText().toString());
values.put("endTime", scheduleEndHourInput.getText().toString() + ":" + scheduleEndMinInput.getText().toString());
values.put("time", date);
// myDatabase.insert("schedules", null, values);
myDatabase.update("schedules",values,"scheduleName=?",new String[]{scheduleName});
// Intent intent2 = new Intent(AddSchedule.this, MainActivity.class);
// startActivity(intent2);
finish();
}
}
private void deleteMySchedule() {
myDatabase.delete("schedules","scheduleName=?",new String[]{scheduleName});
finish();
}
@Override
public void finish() {
setResult(Activity.RESULT_OK);
super.finish();
}
}

@ -0,0 +1,48 @@
package com.diary.showme.diary.bean;
public class DiaryBean {
private String date;
private String title;
private String content;
private String tag;
public DiaryBean(String date, String title, String content, String tagz) {
this.date = date;
this.title = title;
this.content = content;
this.tag = tag;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}

@ -0,0 +1,37 @@
package com.diary.showme.diary.bean;
public class QuestionBean {
private String content;
private String tag;
private String category;
public QuestionBean(String content, String category, String tagz) {
this.content = content;
this.category = category;
this.tag = tagz;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}

@ -0,0 +1,32 @@
package com.diary.showme.diary.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DiaryDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_DIARY = "create table Diary("
+ "id integer primary key autoincrement, "
+ "date text, "
+ "title text, "
+ "tag text, "
+ "content text)";
private Context mContext;
public DiaryDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_DIARY);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Diary");
onCreate(db);
}
}

@ -0,0 +1,18 @@
package com.diary.showme.diary.event;
public class StartUpdateDiaryEvent {
private int position;
public StartUpdateDiaryEvent(int position) {
this.position = position;
}
public void setPosition(int position) {
this.position = position;
}
public int getPosition() {
return position;
}
}

@ -0,0 +1,502 @@
package com.diary.showme.diary.ui;
import android.Manifest;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import androidx.core.app.ActivityCompat;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import com.diary.showme.diary.db.DiaryDatabaseHelper;
import com.diary.showme.diary.utils.AppManager;
import com.diary.showme.diary.utils.GetDate;
import com.diary.showme.diary.utils.StatusBarCompat;
import com.diary.showme.diary.widget.LinedEditText;
import com.diary.showme.R;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cc.trity.floatingactionbutton.FloatingActionButton;
import cc.trity.floatingactionbutton.FloatingActionsMenu;
public class AddDiaryActivity extends AppCompatActivity {
@BindView(R.id.add_diary_tv_date)
TextView mAddDiaryTvDate;
@BindView(R.id.add_diary_et_title)
EditText mAddDiaryEtTitle;
@BindView(R.id.add_diary_et_content)
LinedEditText mAddDiaryEtContent;
@BindView(R.id.add_diary_fab_back)
FloatingActionButton mAddDiaryFabBack;
@BindView(R.id.add_diary_fab_add)
FloatingActionButton mAddDiaryFabAdd;
@BindView(R.id.add_diary_fab_picture)
FloatingActionButton mAddDiaryPicture;
@BindView(R.id.picture1)
ImageView mPicture1;
@BindView(R.id.right_labels)
FloatingActionsMenu mRightLabels;
@BindView(R.id.common_tv_title)
TextView mCommonTvTitle;
@BindView(R.id.common_title_ll)
LinearLayout mCommonTitleLl;
@BindView(R.id.common_iv_back)
ImageView mCommonIvBack;
@BindView(R.id.common_iv_test)
ImageView mCommonIvTest;
private DiaryDatabaseHelper mHelper;
private AlertDialog.Builder builder;
private AlertDialog dialog;
public static final int NONE = 0;
public static final int CAMERA = 11;// 拍照
public static final int PHOTO =22;
public static final int CAMERAZOOM = 33; // 相机拍照缩放
public static final int PHOTOZOOM = 44;//照片缩放
public static final int PHOTORESOULT = 55;// 结果
public static final String IMAGE_UNSPECIFIED = "image/*";
private static final String TAG = "AddM1Activity";
private static final int WRITE_PERMISSION = 0x01;
private Uri uritempFile=null;
private String cameraSavePath=null;
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE};
List<String> mPermissionList = new ArrayList<>();
private static final int PERMISSION_REQUEST = 1010;
private void initPermission(){
mPermissionList.clear();
/**
*
*/
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
/**
*
*/
if (mPermissionList.isEmpty()) {//未授予的权限为空,表示都授予了
} else {//请求权限方法
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST);
}
}
private Message message = null;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1000:
Bitmap bitmap = (Bitmap) msg.obj;
mPicture1.setImageBitmap(bitmap);
break;
case 1001:
mPicture1.setImageBitmap(BitmapFactory.decodeResource(
getResources(), R.mipmap.ic_add_contact_holo_light));
default:
break;
}
};
};
public static void startActivity(Context context) {
Intent intent = new Intent(context, AddDiaryActivity.class);
context.startActivity(intent);
}
public static void startActivity(Context context, String title, String content) {
Intent intent = new Intent(context, AddDiaryActivity.class);
intent.putExtra("title", title);
intent.putExtra("content", content);
context.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_diary);
AppManager.getAppManager().addActivity(this);
ButterKnife.bind(this);
// ActionBar actionBar = getSupportActionBar();
// actionBar.hide();
Intent intent = getIntent();
mAddDiaryEtTitle.setText(intent.getStringExtra("title"));
StatusBarCompat.compat(this, Color.parseColor("#161414"));
mCommonTvTitle.setText("添加日记");
mAddDiaryTvDate.setText("今天," + GetDate.getDate());
mAddDiaryEtContent.setText(intent.getStringExtra("content"));
mHelper = new DiaryDatabaseHelper(this, "Diary.db", null, 1);
initPermission();
File f = new File(Environment.getExternalStorageDirectory()
, "qwert.jpg");
if (f.exists()) {
// Bitmap bitmap=BitmapFactory.decodeFile(f.getPath());
// icon.setImageBitmap(bitmap);
}
}
@OnClick({R.id.common_iv_back, R.id.add_diary_et_title, R.id.add_diary_et_content, R.id.add_diary_fab_back, R.id.add_diary_fab_add, R.id.add_diary_fab_picture})
public void onClick(View view) {
switch (view.getId()) {
case R.id.common_iv_back:
DiaryActivity.startActivity(this);
case R.id.add_diary_et_title:
break;
case R.id.add_diary_et_content:
break;
case R.id.add_diary_fab_back:
String date = GetDate.getDate().toString();
String tag = String.valueOf(System.currentTimeMillis());
String title = mAddDiaryEtTitle.getText().toString() + "";
String content = mAddDiaryEtContent.getText().toString() + "";
if (!title.equals("") || !content.equals("")) {
SQLiteDatabase db = mHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("date", date);
values.put("title", title);
values.put("content", content);
values.put("tag", tag);
db.insert("Diary", null, values);
values.clear();
}
DiaryActivity.startActivity(this);
break;
case R.id.add_diary_fab_add:
final String dateBack = GetDate.getDate().toString();
final String titleBack = mAddDiaryEtTitle.getText().toString();
final String contentBack = mAddDiaryEtContent.getText().toString();
if(!titleBack.isEmpty() || !contentBack.isEmpty()){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("是否保存日记内容?").setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
SQLiteDatabase db = mHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("date", dateBack);
values.put("title", titleBack);
values.put("content", contentBack);
db.insert("Diary", null, values);
values.clear();
DiaryActivity.startActivity(AddDiaryActivity.this);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
DiaryActivity.startActivity(AddDiaryActivity.this);
}
}).show();
}else{
DiaryActivity.startActivity(this);
}
break;
case R.id.add_diary_fab_picture:
selectOperator();// 拍照或者调用图库
break;
}
}
private void saveimage(Bitmap bmp){
File f = new File(Environment.getExternalStorageDirectory()
, "qwert.jpg");
try {
FileOutputStream fos = new FileOutputStream(f);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
System.out.println("111111111111111111==="+f.length());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Intent intent =getIntent();
String action=intent.getStringExtra("android_manage_type");
if(action!=null)
{
if(action.equals("add"))
{
}
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if(dialog!=null){
dialog.dismiss();
}
}
private void openCamera(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraSavePath =Environment.getExternalStorageDirectory()+ File.separator + "Android"+File.separator+"xx.jpg";
File f_camera =new File(cameraSavePath);
Uri uri_camera;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//test.xxx.com.myapplication.fileprovider 是在清单文件配置的 android:authorities
uri_camera = FileProvider.getUriForFile(this, "com.example.dairyexanple.fileprovider", f_camera);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
System.out.println("openCamera cameraSavePath length=="+f_camera.length());
}else {
uri_camera = Uri.fromFile(f_camera);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri_camera);
startActivityForResult(intent, CAMERA);
}
private void choosePhoto() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
IMAGE_UNSPECIFIED);
startActivityForResult(intent, PHOTO);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST:
break;
default:
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void startPhotoZoom2(Uri uri) {
// 调用系统中自带的图片剪裁
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory()+ File.separator + "Android" + "/icon_temp1.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
intent.putExtra("return-data", true);
startActivityForResult(intent, PHOTOZOOM);
}
/**
*
*/
private void startPhoneZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(uri, "image/*");
//是否可裁剪
intent.putExtra("corp", "true");
//裁剪器高宽比
intent.putExtra("aspectY", 1);
intent.putExtra("aspectX", 1);
//设置裁剪框高宽
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
// Uri temp =Uri.parse(cameraSavePath); //Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + System.currentTimeMillis() + ".jpg");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri temp =Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath()+ File.separator + "Android"+File.separator+"xx.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, temp);
}
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
//返回数据
intent.putExtra("return-data", true);
startActivityForResult(intent, CAMERAZOOM);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
System.out.println("onActivityResult== requestCode="+requestCode+" data ="+data);
// 读取相册缩放图片
if (requestCode == PHOTO) {
startPhotoZoom2(data.getData());
}else if(requestCode==PHOTOZOOM){
File file = null;
try {
file = new File(new URI(uritempFile.toString()));
} catch (URISyntaxException e) {
e.printStackTrace();
}
System.out.println("uritempFile.toString()=="+uritempFile.toString()+" "+file.length());
Bitmap photo = BitmapFactory.decodeFile(file.toString());
saveimage(photo);
message =new Message();
message.what=1000;
message.obj =photo;
handler.sendMessageDelayed(message, 100);
}else if(requestCode==CAMERAZOOM){
Bitmap photo=null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
File file = null;
Uri temp =Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath()+ File.separator + "Android"+File.separator+"xx.jpg");
try {
file = new File(new URI(temp.toString()));
} catch (Exception e) {
e.printStackTrace();
}
photo = BitmapFactory.decodeFile(file.toString());
}else{
File f =new File(cameraSavePath);
System.out.println("文件大小 =="+f.length());
photo = BitmapFactory.decodeFile(f.toString());
}
saveimage(photo);
message =new Message();
message.what=1000;
message.obj =photo;
handler.sendMessageDelayed(message, 100);
System.out.println("qqqqqqqqqq =");
}else if(requestCode==CAMERA){
//相机返回结果
File mAvatarFile = new File(cameraSavePath);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//test.xxx.com.myapplication.fileprovider 是在清单文件配置的 android:authorities
uri = FileProvider.getUriForFile(this, "com.example.dairyexanple.fileprovider", mAvatarFile);
System.out.println("open camera 2222222 mAvatarFile length=="+mAvatarFile.length());
}else {
uri = Uri.fromFile(mAvatarFile);
}
startPhoneZoom(uri);
System.out.println("uritempFile.toString()==");
}
super.onActivityResult(requestCode, resultCode, data);
}
private void selectOperator(){
List<String> list = new ArrayList<String>();
list.add(0, "从相册中选择");
list.add(1, "相机");
builder = new AlertDialog.Builder(this);
builder.setTitle("请选择获取图片的方式");
builder.setItems(list.toArray(new String[list.size()]), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
choosePhoto();
} else if (which == 1) {
openCamera();
}else{
/*new Utils(AddM1Activity.this)
.deleteIcon_temp_01();
//deleteIcon_temp();
message =new Message();
message.what=1001;
handler.sendMessageDelayed(message, 100);*/
}
}
});
builder.setCancelable(true);
builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
System.out.println("clicked----"+keyCode);
dialog.dismiss();
// finish();
return false;
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
System.out.println("click onCancel");
}
});
builder.create().show();
}
@Override
public void onBackPressed() {
super.onBackPressed();
DiaryActivity.startActivity(this);
}
}

@ -0,0 +1,74 @@
package com.diary.showme.diary.ui;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.content.Context;
import android.graphics.Color;
import android.os.Environment;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.diary.showme.Course.AddCourseActivity;
import com.diary.showme.Course.Course;
import com.diary.showme.Course.CourseActivity;
import com.diary.showme.R;
import com.diary.showme.diary.utils.AppManager;
public class CardActivity extends AppCompatActivity {
private Button card1;
private Button card2;
private Button card3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.card);
AppManager.getAppManager().addActivity(this);
card1 = findViewById(R.id.card1);
card2 = findViewById(R.id.card2);
card3 = findViewById(R.id.card3);
card1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CardActivity.this, AddDiaryActivity.class);
startActivity(intent);
}
});
card2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CardActivity.this, AddDiaryActivity.class);
startActivity(intent);
}
});
card3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CardActivity.this, AddDiaryActivity.class);
startActivity(intent);
}
});
}
public static void startActivity(Context context) {
Intent intent = new Intent(context, CardActivity.class);
context.startActivity(intent);
}
@Override
public void onBackPressed() {
AppManager.getAppManager().findActivity(CardActivity.class);
super.onBackPressed();
}
}

@ -0,0 +1,273 @@
package com.diary.showme.diary.ui;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.diary.showme.Course.AddCourseActivity;
import com.diary.showme.Course.CourseActivity;
import com.diary.showme.diary.bean.DiaryBean;
import com.diary.showme.diary.db.DiaryDatabaseHelper;
import com.diary.showme.diary.event.StartUpdateDiaryEvent;
import com.diary.showme.diary.utils.AppManager;
import com.diary.showme.diary.utils.GetDate;
import com.diary.showme.diary.utils.SpHelper;
import com.diary.showme.diary.utils.StatusBarCompat;
import com.diary.showme.R;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class DiaryActivity extends AppCompatActivity implements View.OnClickListener{
@BindView(R.id.common_iv_back)
ImageView mCommonIvBack;
@BindView(R.id.common_tv_title)
TextView mCommonTvTitle;
@BindView(R.id.common_iv_test)
ImageView mCommonIvTest;
@BindView(R.id.common_title_ll)
LinearLayout mCommonTitleLl;
@BindView(R.id.main_iv_circle)
ImageView mMainIvCircle;
@BindView(R.id.main_tv_date)
TextView mMainTvDate;
@BindView(R.id.main_tv_content)
TextView mMainTvContent;
@BindView(R.id.item_ll_control)
LinearLayout mItemLlControl;
@BindView(R.id.main_rv_show_diary)
RecyclerView mMainRvShowDiary;
@BindView(R.id.main_pause)
FloatingActionButton mMainpause;
@BindView(R.id.main_play)
FloatingActionButton mMainplay;
@BindView(R.id.main_stop)
FloatingActionButton mMainstop;
@BindView(R.id.main_fab_enter_edit)
FloatingActionButton mMainFabEnterEdit;
@BindView(R.id.main_rl_main)
RelativeLayout mMainRlMain;
@BindView(R.id.item_first)
LinearLayout mItemFirst;
@BindView(R.id.main_ll_main)
LinearLayout mMainLlMain;
private List<DiaryBean> mDiaryBeanList;
private DiaryDatabaseHelper mHelper;
private static String IS_WRITE = "true";
private int mEditPosition = -1;
private MediaPlayer mediaPlayer = new MediaPlayer();
private DiaryAdapter adapter;
private Integer i = 0;
/**
*
*/
private boolean isWrite = false;
private static TextView mTvTest;
public static void startActivity(Context context) {
Intent intent = new Intent(context, DiaryActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary);
AppManager.getAppManager().addActivity(this);
ButterKnife.bind(this);
StatusBarCompat.compat(this, Color.parseColor("#161414"));
mHelper = new DiaryDatabaseHelper(this, "Diary.db", null, 1);
// ActionBar actionBar = getSupportActionBar();
// actionBar.hide();
EventBus.getDefault().register(this);
SpHelper spHelper = SpHelper.getInstance(this);
getDiaryBeanList();
initTitle();
mMainRvShowDiary.setLayoutManager(new LinearLayoutManager(this));
mMainRvShowDiary.setAdapter(new DiaryAdapter(this, mDiaryBeanList));
mTvTest = new TextView(this);
mTvTest.setText("hello world");
mMainplay.setOnClickListener(this);
mMainpause.setOnClickListener(this);
mMainstop.setOnClickListener(this);
//权限判断,如果没有权限就请求权限
if (ContextCompat.checkSelfPermission(DiaryActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(DiaryActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
initMediaPlayer();//初始化播放器 MediaPlayer
}
}
private void initTitle() {
mMainTvDate.setText("今天," + GetDate.getDate());
mCommonTvTitle.setText("日记");
mCommonIvBack.setVisibility(View.INVISIBLE);
mCommonIvTest.setVisibility(View.INVISIBLE);
}
private List<DiaryBean> getDiaryBeanList() {
mDiaryBeanList = new ArrayList<>();
List<DiaryBean> diaryList = new ArrayList<>();
SQLiteDatabase sqLiteDatabase = mHelper.getWritableDatabase();
Cursor cursor = sqLiteDatabase.query("Diary", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String date = cursor.getString(cursor.getColumnIndex("date"));
String dateSystem = GetDate.getDate().toString();
if (date.equals(dateSystem)) {
mMainLlMain.removeView(mItemFirst);
break;
}
} while (cursor.moveToNext());
}
if (cursor.moveToFirst()) {
do {
String date = cursor.getString(cursor.getColumnIndex("date"));
String title = cursor.getString(cursor.getColumnIndex("title"));
String content = cursor.getString(cursor.getColumnIndex("content"));
String tag = cursor.getString(cursor.getColumnIndex("tag"));
mDiaryBeanList.add(new DiaryBean(date, title, content, tag));
} while (cursor.moveToNext());
}
cursor.close();
for (int i = mDiaryBeanList.size() - 1; i >= 0; i--) {
diaryList.add(mDiaryBeanList.get(i));
}
mDiaryBeanList = diaryList;
return mDiaryBeanList;
}
private void initMediaPlayer() {
try {
Integer num_of_raw = 2;//歌曲的总数目
Uri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/"+"music"+i);
mediaPlayer.reset();//重置音乐播放器
//加载多媒体文件
mediaPlayer=MediaPlayer.create(getApplicationContext(),uri);
mediaPlayer.setLooping(true);//设置为循环播放
i = (i+1) % num_of_raw;
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initMediaPlayer();
} else {
Toast.makeText(this, "拒绝权限,将无法使用程序。", Toast.LENGTH_LONG).show();
finish();
}
break;
default:
}
}
@OnClick({R.id.main_play, R.id.main_pause, R.id.main_stop, R.id.main_fab_enter_edit})
public void onClick(View view) {
switch (view.getId()) {
case R.id.main_play:
//如果没在播放中,立刻开始播放。
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
}
break;
case R.id.main_pause:
//如果在播放中,立刻暂停。
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
break;
case R.id.main_stop:
//如果在播放中,立刻停止。
if(mediaPlayer.isPlaying()){
mediaPlayer.reset();
initMediaPlayer();//初始化播放器 MediaPlayer
}
break;
case R.id.main_fab_enter_edit:
Intent intent = new Intent(DiaryActivity.this, CardActivity.class);
startActivity(intent);
break;
}
}
@Subscribe
public void startUpdateDiaryActivity(StartUpdateDiaryEvent event) {
String title = mDiaryBeanList.get(event.getPosition()).getTitle();
String content = mDiaryBeanList.get(event.getPosition()).getContent();
String tag = mDiaryBeanList.get(event.getPosition()).getTag();
UpdateDiaryActivity.startActivity(this, title, content, tag);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
AppManager.getAppManager().AppExit(this);
}
}

@ -0,0 +1,108 @@
package com.diary.showme.diary.ui;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.diary.showme.diary.bean.DiaryBean;
import com.diary.showme.diary.event.StartUpdateDiaryEvent;
import com.diary.showme.diary.utils.GetDate;
import com.diary.showme.R;
import org.greenrobot.eventbus.EventBus;
import java.util.List;
public class DiaryAdapter extends RecyclerView.Adapter<DiaryAdapter.DiaryViewHolder> {
private Context mContext;
private LayoutInflater mLayoutInflater;
private List<DiaryBean> mDiaryBeanList;
private int mEditPosition = -1;
public DiaryAdapter(Context context, List<DiaryBean> mDiaryBeanList){
mContext = context;
this.mLayoutInflater = LayoutInflater.from(context);
this.mDiaryBeanList = mDiaryBeanList;
}
@Override
public DiaryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new DiaryViewHolder(mLayoutInflater.inflate(R.layout.item_rv_diary, parent, false));
}
@Override
public void onBindViewHolder(final DiaryViewHolder holder, final int position) {
String dateSystem = GetDate.getDate().toString();
if(mDiaryBeanList.get(position).getDate().equals(dateSystem)){
holder.mIvCircle.setImageResource(R.drawable.circle_orange);
}
holder.mTvDate.setText(mDiaryBeanList.get(position).getDate());
holder.mTvTitle.setText(mDiaryBeanList.get(position).getTitle());
holder.mTvContent.setText(" " + mDiaryBeanList.get(position).getContent());
holder.mIvEdit.setVisibility(View.INVISIBLE);
if(mEditPosition == position){
holder.mIvEdit.setVisibility(View.VISIBLE);
}else {
holder.mIvEdit.setVisibility(View.GONE);
}
holder.mLl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(holder.mIvEdit.getVisibility() == View.VISIBLE){
holder.mIvEdit.setVisibility(View.GONE);
}else {
holder.mIvEdit.setVisibility(View.VISIBLE);
}
if(mEditPosition != position){
notifyItemChanged(mEditPosition);
}
mEditPosition = position;
}
});
holder.mIvEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new StartUpdateDiaryEvent(position));
}
});
}
@Override
public int getItemCount() {
return mDiaryBeanList.size();
}
public static class DiaryViewHolder extends RecyclerView.ViewHolder{
TextView mTvDate;
TextView mTvTitle;
TextView mTvContent;
ImageView mIvEdit;
LinearLayout mLlTitle;
LinearLayout mLl;
ImageView mIvCircle;
LinearLayout mLlControl;
RelativeLayout mRlEdit;
DiaryViewHolder(View view){
super(view);
mIvCircle = (ImageView) view.findViewById(R.id.main_iv_circle);
mTvDate = (TextView) view.findViewById(R.id.main_tv_date);
mTvTitle = (TextView) view.findViewById(R.id.main_tv_title);
mTvContent = (TextView) view.findViewById(R.id.main_tv_content);
mIvEdit = (ImageView) view.findViewById(R.id.main_iv_edit);
mLlTitle = (LinearLayout) view.findViewById(R.id.main_ll_title);
mLl = (LinearLayout) view.findViewById(R.id.item_ll);
mLlControl = (LinearLayout) view.findViewById(R.id.item_ll_control);
mRlEdit = (RelativeLayout) view.findViewById(R.id.item_rl_edit);
}
}
}

@ -0,0 +1,108 @@
package com.diary.showme.diary.ui;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chanven.lib.cptr.PtrClassicFrameLayout;
import com.chanven.lib.cptr.PtrDefaultHandler;
import com.chanven.lib.cptr.PtrFrameLayout;
import com.chanven.lib.cptr.recyclerview.RecyclerAdapterWithHF;
import com.diary.showme.R;
import com.diary.showme.diary.bean.QuestionBean;
import com.idealist.calendarview.SpaceItemDecoration;
import java.util.ArrayList;
import java.util.List;
public class QuestionActivity extends AppCompatActivity {
private Button back;
private RecyclerView question_view;
private QuestionAdapter questionAdapter;
private List<QuestionBean> mData = new ArrayList<>();
private RecyclerAdapterWithHF mQuestionAdapter;
private PtrClassicFrameLayout frameLayout;
private Handler handler;
private int page = 0;
private String date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_question);
frameLayout = findViewById(R.id.question_frame);
handler = new Handler();
initBtn();
initView();
}
private void initBtn() {
back = findViewById(R.id.back_calendar);
back.setOnClickListener(v -> finish());
}
private void initView() {
Intent intent = getIntent();
date = intent.getStringExtra("date");
question_view = findViewById(R.id.question_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
question_view.setLayoutManager(layoutManager);
question_view.addItemDecoration(new SpaceItemDecoration(20));
mData.add(new QuestionBean("test", "curr", "test"));
mData.add(new QuestionBean("test", "curr", "test"));
mData.add(new QuestionBean("test", "curr", "test"));
mData.add(new QuestionBean("test", "curr", "test"));
mData.add(new QuestionBean("test", "curr", "test"));
mData.add(new QuestionBean("test", "curr", "test"));
mData.add(new QuestionBean("test", "curr", "test"));
mData.add(new QuestionBean("test", "curr", "test"));
questionAdapter = new QuestionAdapter(this, mData);
mQuestionAdapter = new RecyclerAdapterWithHF(questionAdapter);
question_view.setAdapter(mQuestionAdapter);
frameLayout.postDelayed(() -> frameLayout.autoRefresh(true), 150);
frameLayout.setPtrHandler(new PtrDefaultHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
handler.postDelayed(() -> {
page = 0;
mData.clear();
for (int i=0; i<10; i++) {
mData.add(new QuestionBean("test", "curr", "test"));
}
mQuestionAdapter.notifyDataSetChanged();
frameLayout.refreshComplete();
frameLayout.setLoadMoreEnable(true);
}, 1500);
}
});
frameLayout.setOnLoadMoreListener(() -> handler.postDelayed(() -> {
mData.add(new QuestionBean("test", "curr", "test"));
mQuestionAdapter.notifyDataSetChanged();
frameLayout.loadMoreComplete(true);
page++;
Toast.makeText(QuestionActivity.this, "loading more complete", Toast.LENGTH_SHORT).show();
}, 1000));
}
}

@ -0,0 +1,54 @@
package com.diary.showme.diary.ui;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.diary.showme.R;
import com.diary.showme.diary.bean.QuestionBean;
import java.util.List;
public class QuestionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {
private Context context;
private List<QuestionBean> items;
public QuestionAdapter(Context context, List<QuestionBean> items) {
super();
this.items = items;
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.question_item, parent, false);
return new QuestionViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (!(holder instanceof QuestionViewHolder))
return;
QuestionBean item = items.get(position);
((QuestionViewHolder) holder).question_content.setText(item.getContent());
((QuestionViewHolder) holder).question_content.setOnClickListener(this::onClick);
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public void onClick(View v) {
Intent intent = new Intent(context, AddDiaryActivity.class);
context.startActivity(intent);
}
}

@ -0,0 +1,18 @@
package com.diary.showme.diary.ui;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.diary.showme.R;
public class QuestionViewHolder extends RecyclerView.ViewHolder{
public TextView question_content;
public QuestionViewHolder(@NonNull View itemView) {
super(itemView);
question_content = itemView.findViewById(R.id.question_content);
}
}

@ -0,0 +1,496 @@
package com.diary.showme.diary.ui;
import android.Manifest;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import androidx.core.app.ActivityCompat;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import com.diary.showme.diary.db.DiaryDatabaseHelper;
import com.diary.showme.diary.utils.AppManager;
import com.diary.showme.diary.utils.GetDate;
import com.diary.showme.diary.utils.StatusBarCompat;
import com.diary.showme.diary.widget.LinedEditText;
import com.diary.showme.R;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.BindView;
import cc.trity.floatingactionbutton.FloatingActionButton;
import cc.trity.floatingactionbutton.FloatingActionsMenu;
public class UpdateDiaryActivity extends AppCompatActivity {
@BindView(R.id.picture2)
ImageView mPicture2;
@BindView(R.id.update_diary_fab_picture)
FloatingActionButton mUpdateDiaryPicture;
@BindView(R.id.update_diary_tv_date)
TextView mUpdateDiaryTvDate;
@BindView(R.id.update_diary_et_title)
EditText mUpdateDiaryEtTitle;
@BindView(R.id.update_diary_et_content)
LinedEditText mUpdateDiaryEtContent;
@BindView(R.id.update_diary_fab_back)
FloatingActionButton mUpdateDiaryFabBack;
@BindView(R.id.update_diary_fab_add)
FloatingActionButton mUpdateDiaryFabAdd;
@BindView(R.id.update_diary_fab_delete)
FloatingActionButton mUpdateDiaryFabDelete;
@BindView(R.id.right_labels)
FloatingActionsMenu mRightLabels;
@BindView(R.id.common_tv_title)
TextView mCommonTvTitle;
@BindView(R.id.common_title_ll)
LinearLayout mCommonTitleLl;
@BindView(R.id.common_iv_back)
ImageView mCommonIvBack;
@BindView(R.id.common_iv_test)
ImageView mCommonIvTest;
@BindView(R.id.update_diary_tv_tag)
TextView mTvTag;
private AlertDialog.Builder builder;
private AlertDialog dialog;
public static final int NONE = 0;
public static final int CAMERA = 11;// 拍照
public static final int PHOTO =22;
public static final int CAMERAZOOM = 33; // 相机拍照缩放
public static final int PHOTOZOOM = 44;//照片缩放
public static final int PHOTORESOULT = 55;// 结果
public static final String IMAGE_UNSPECIFIED = "image/*";
private static final String TAG = "AddM1Activity";
private static final int WRITE_PERMISSION = 0x01;
private Uri uritempFile=null;
private String cameraSavePath=null;
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE};
List<String> mPermissionList = new ArrayList<>();
private static final int PERMISSION_REQUEST = 1010;
private void initPermission(){
mPermissionList.clear();
/**
*
*/
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
/**
*
*/
if (mPermissionList.isEmpty()) {//未授予的权限为空,表示都授予了
} else {//请求权限方法
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST);
}
}
private Message message = null;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1000:
Bitmap bitmap = (Bitmap) msg.obj;
mPicture2.setImageBitmap(bitmap);
break;
case 1001:
mPicture2.setImageBitmap(BitmapFactory.decodeResource(
getResources(), R.mipmap.ic_add_contact_holo_light));
default:
break;
}
};
};
private DiaryDatabaseHelper mHelper;
public static void startActivity(Context context, String title, String content, String tag) {
Intent intent = new Intent(context, UpdateDiaryActivity.class);
intent.putExtra("title", title);
intent.putExtra("content", content);
intent.putExtra("tag", tag);
context.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_diary);
AppManager.getAppManager().addActivity(this);
ButterKnife.bind(this);
mHelper = new DiaryDatabaseHelper(this, "Diary.db", null, 1);
initTitle();
StatusBarCompat.compat(this, Color.parseColor("#161414"));
Intent intent = getIntent();
mUpdateDiaryTvDate.setText("今天," + GetDate.getDate());
mUpdateDiaryEtTitle.setText(intent.getStringExtra("title"));
mUpdateDiaryEtContent.setText(intent.getStringExtra("content"));
mTvTag.setText(intent.getStringExtra("tag"));
initPermission();
File f = new File(Environment.getExternalStorageDirectory()
, "qwert.jpg");
if (f.exists()) {
// Bitmap bitmap=BitmapFactory.decodeFile(f.getPath());
// icon.setImageBitmap(bitmap);
}
}
private void initTitle() {
// ActionBar actionBar = getSupportActionBar();
// actionBar.hide();
mCommonTvTitle.setText("修改日记");
}
@OnClick({R.id.common_iv_back, R.id.update_diary_tv_date, R.id.update_diary_et_title, R.id.update_diary_et_content, R.id.update_diary_fab_back, R.id.update_diary_fab_add, R.id.update_diary_fab_delete, R.id.update_diary_fab_picture})
public void onClick(View view) {
switch (view.getId()) {
case R.id.common_iv_back:
DiaryActivity.startActivity(this);
case R.id.update_diary_tv_date:
break;
case R.id.update_diary_et_title:
break;
case R.id.update_diary_et_content:
break;
case R.id.update_diary_fab_back:
androidx.appcompat.app.AlertDialog.Builder alertDialogBuilder = new androidx.appcompat.app.AlertDialog.Builder(this);
alertDialogBuilder.setMessage("确定要删除该日记吗?").setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// String title = mUpdateDiaryEtTitle.getText().toString();
String tag = mTvTag.getText().toString();
SQLiteDatabase dbDelete = mHelper.getWritableDatabase();
dbDelete.delete("Diary", "tag = ?", new String[]{tag});
DiaryActivity.startActivity(UpdateDiaryActivity.this);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).show();
break;
case R.id.update_diary_fab_add:
SQLiteDatabase dbUpdate = mHelper.getWritableDatabase();
ContentValues valuesUpdate = new ContentValues();
String title = mUpdateDiaryEtTitle.getText().toString();
String content = mUpdateDiaryEtContent.getText().toString();
valuesUpdate.put("title", title);
valuesUpdate.put("content", content);
dbUpdate.update("Diary", valuesUpdate, "title = ?", new String[]{title});
dbUpdate.update("Diary", valuesUpdate, "content = ?", new String[]{content});
DiaryActivity.startActivity(this);
break;
case R.id.update_diary_fab_delete:
DiaryActivity.startActivity(this);
break;
case R.id.update_diary_fab_picture:
selectOperator();// 拍照或者调用图库
break;
}
}
private void saveimage(Bitmap bmp){
File f = new File(Environment.getExternalStorageDirectory()
, "qwert.jpg");
try {
FileOutputStream fos = new FileOutputStream(f);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
System.out.println("111111111111111111==="+f.length());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Intent intent =getIntent();
String action=intent.getStringExtra("android_manage_type");
if(action!=null)
{
if(action.equals("add"))
{
}
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if(dialog!=null){
dialog.dismiss();
}
}
private void openCamera(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraSavePath =Environment.getExternalStorageDirectory()+ File.separator + "Android"+File.separator+"xx.jpg";
File f_camera =new File(cameraSavePath);
Uri uri_camera;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//test.xxx.com.myapplication.fileprovider 是在清单文件配置的 android:authorities
uri_camera = FileProvider.getUriForFile(this, "com.example.dairyexanple.fileprovider", f_camera);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
System.out.println("openCamera cameraSavePath length=="+f_camera.length());
}else {
uri_camera = Uri.fromFile(f_camera);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri_camera);
startActivityForResult(intent, CAMERA);
}
private void choosePhoto() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
IMAGE_UNSPECIFIED);
startActivityForResult(intent, PHOTO);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST:
break;
default:
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void startPhotoZoom2(Uri uri) {
// 调用系统中自带的图片剪裁
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory()+ File.separator + "Android" + "/icon_temp1.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
intent.putExtra("return-data", true);
startActivityForResult(intent, PHOTOZOOM);
}
/**
*
*/
private void startPhoneZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(uri, "image/*");
//是否可裁剪
intent.putExtra("corp", "true");
//裁剪器高宽比
intent.putExtra("aspectY", 1);
intent.putExtra("aspectX", 1);
//设置裁剪框高宽
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
// Uri temp =Uri.parse(cameraSavePath); //Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + System.currentTimeMillis() + ".jpg");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri temp =Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath()+ File.separator + "Android"+File.separator+"xx.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, temp);
}
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
//返回数据
intent.putExtra("return-data", true);
startActivityForResult(intent, CAMERAZOOM);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
System.out.println("onActivityResult== requestCode="+requestCode+" data ="+data);
// 读取相册缩放图片
if (requestCode == PHOTO) {
startPhotoZoom2(data.getData());
}else if(requestCode==PHOTOZOOM){
File file = null;
try {
file = new File(new URI(uritempFile.toString()));
} catch (URISyntaxException e) {
e.printStackTrace();
}
System.out.println("uritempFile.toString()=="+uritempFile.toString()+" "+file.length());
Bitmap photo = BitmapFactory.decodeFile(file.toString());
saveimage(photo);
message =new Message();
message.what=1000;
message.obj =photo;
handler.sendMessageDelayed(message, 100);
}else if(requestCode==CAMERAZOOM){
Bitmap photo=null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
File file = null;
Uri temp =Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath()+ File.separator + "Android"+File.separator+"xx.jpg");
try {
file = new File(new URI(temp.toString()));
} catch (Exception e) {
e.printStackTrace();
}
photo = BitmapFactory.decodeFile(file.toString());
}else{
File f =new File(cameraSavePath);
System.out.println("文件大小 =="+f.length());
photo = BitmapFactory.decodeFile(f.toString());
}
saveimage(photo);
message =new Message();
message.what=1000;
message.obj =photo;
handler.sendMessageDelayed(message, 100);
System.out.println("qqqqqqqqqq =");
}else if(requestCode==CAMERA){
//相机返回结果
File mAvatarFile = new File(cameraSavePath);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//test.xxx.com.myapplication.fileprovider 是在清单文件配置的 android:authorities
uri = FileProvider.getUriForFile(this, "com.example.dairyexanple.fileprovider", mAvatarFile);
System.out.println("open camera 2222222 mAvatarFile length=="+mAvatarFile.length());
}else {
uri = Uri.fromFile(mAvatarFile);
}
startPhoneZoom(uri);
System.out.println("uritempFile.toString()==");
}
super.onActivityResult(requestCode, resultCode, data);
}
private void selectOperator(){
List<String> list = new ArrayList<String>();
list.add(0, "从相册中选择");
list.add(1, "相机");
builder = new AlertDialog.Builder(this);
builder.setTitle("请选择获取图片的方式");
builder.setItems(list.toArray(new String[list.size()]), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
choosePhoto();
} else if (which == 1) {
openCamera();
}else{
/*new Utils(AddM1Activity.this)
.deleteIcon_temp_01();
//deleteIcon_temp();
message =new Message();
message.what=1001;
handler.sendMessageDelayed(message, 100);*/
}
}
});
builder.setCancelable(true);//
builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
System.out.println("clicked----"+keyCode);
dialog.dismiss();
// finish();
return false;
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
System.out.println("click onCancel");
}
});
builder.create().show();
}
@OnClick(R.id.common_tv_title)
public void onClick() {
}
@Override
public void onBackPressed() {
super.onBackPressed();
DiaryActivity.startActivity(this);
}
}

@ -0,0 +1,96 @@
package com.diary.showme.diary.utils;
import android.app.ActivityManager;
import android.content.Context;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Stack;
public class AppManager {
private static Stack<AppCompatActivity> activityStack;
private static AppManager instance;
private AppManager(){}
public static AppManager getAppManager(){
if(instance == null){
synchronized (AppManager.class){
if(instance == null){
instance = new AppManager();
}
}
}
return instance;
}
public void addActivity(AppCompatActivity activity){
if(activityStack == null){
activityStack = new Stack<>();
}
activityStack.add(activity);
}
public AppCompatActivity currentActivity(){
if(activityStack == null || activityStack.isEmpty()){
return null;
}
AppCompatActivity acitivity = activityStack.lastElement();
return acitivity;
}
public AppCompatActivity findActivity(Class<?> cls){
AppCompatActivity activity = null;
for (AppCompatActivity appCompatActivity : activityStack) {
if(appCompatActivity.getClass().equals(cls)){
activity = appCompatActivity;
break;
}
}
return activity;
}
public void finishActivity(){
AppCompatActivity activity = activityStack.lastElement();
finishActivity(activity);
}
public void finishActivity(AppCompatActivity activity){
if(activity != null){
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
public void finishActivity(Class<?> cls){
for (AppCompatActivity activity : activityStack) {
if(activity.getClass().equals(cls)){
finishActivity(activity);
}
}
}
public void finishAllActivity(){
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
public void AppExit(Context context){
try{
finishAllActivity();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.killBackgroundProcesses(context.getPackageName());
System.exit(0);
}catch (Exception e){
e.printStackTrace();
}
}
}

@ -0,0 +1,16 @@
package com.diary.showme.diary.utils;
import java.util.Calendar;
public class GetDate {
public static StringBuilder getDate(){
StringBuilder stringBuilder = new StringBuilder();
Calendar now = Calendar.getInstance();
stringBuilder.append(now.get(Calendar.YEAR) + "年");
stringBuilder.append((int)(now.get(Calendar.MONTH) + 1) + "月");
stringBuilder.append(now.get(Calendar.DAY_OF_MONTH) + "日");
return stringBuilder;
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save