Charlie-CMM 3 năm trước cách đây
commit
10e1e336d1
100 tập tin đã thay đổi với 1346 bổ sung0 xóa
  1. 14 0
      .gitignore
  2. 3 0
      .idea/.gitignore
  3. 1 0
      .idea/.name
  4. 116 0
      .idea/codeStyles/Project.xml
  5. 6 0
      .idea/compiler.xml
  6. 21 0
      .idea/gradle.xml
  7. 25 0
      .idea/jarRepositories.xml
  8. 68 0
      .idea/misc.xml
  9. 6 0
      .idea/vcs.xml
  10. 1 0
      app/.gitignore
  11. 34 0
      app/build.gradle
  12. 21 0
      app/proguard-rules.pro
  13. BIN
      app/release/app-release.apk
  14. 20 0
      app/release/output-metadata.json
  15. 26 0
      app/src/androidTest/java/net/penguincoders/doit/ExampleInstrumentedTest.java
  16. 25 0
      app/src/main/AndroidManifest.xml
  17. BIN
      app/src/main/calendar-playstore.png
  18. BIN
      app/src/main/calendarblack-playstore.png
  19. BIN
      app/src/main/check_mark-playstore.png
  20. BIN
      app/src/main/check_mark_black-playstore.png
  21. BIN
      app/src/main/ic_launcher-playstore.png
  22. 103 0
      app/src/main/java/net/penguincoders/doit/Adapters/ToDoAdapter.java
  23. 125 0
      app/src/main/java/net/penguincoders/doit/AddNewTask.java
  24. 27 0
      app/src/main/java/net/penguincoders/doit/CalendarActivity.java
  25. 7 0
      app/src/main/java/net/penguincoders/doit/DialogCloseListener.java
  26. 98 0
      app/src/main/java/net/penguincoders/doit/MainActivity.java
  27. 30 0
      app/src/main/java/net/penguincoders/doit/Model/ToDoModel.java
  28. 104 0
      app/src/main/java/net/penguincoders/doit/RecyclerItemTouchHelper.java
  29. 26 0
      app/src/main/java/net/penguincoders/doit/SplashActivity.java
  30. 97 0
      app/src/main/java/net/penguincoders/doit/Utils/DatabaseHandler.java
  31. BIN
      app/src/main/mask_group-playstore.png
  32. 30 0
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  33. 5 0
      app/src/main/res/drawable/ic_baseline_add_24.xml
  34. 5 0
      app/src/main/res/drawable/ic_baseline_delete.xml
  35. 5 0
      app/src/main/res/drawable/ic_baseline_edit.xml
  36. BIN
      app/src/main/res/drawable/logo.png
  37. 80 0
      app/src/main/res/layout/activity_calendar.xml
  38. 88 0
      app/src/main/res/layout/activity_main.xml
  39. 14 0
      app/src/main/res/layout/activity_splash.xml
  40. 27 0
      app/src/main/res/layout/new_task.xml
  41. 28 0
      app/src/main/res/layout/task_layout.xml
  42. 5 0
      app/src/main/res/mipmap-anydpi-v26/calendar.xml
  43. 5 0
      app/src/main/res/mipmap-anydpi-v26/calendar_round.xml
  44. 5 0
      app/src/main/res/mipmap-anydpi-v26/calendarblack.xml
  45. 5 0
      app/src/main/res/mipmap-anydpi-v26/calendarblack_round.xml
  46. 5 0
      app/src/main/res/mipmap-anydpi-v26/check_mark.xml
  47. 5 0
      app/src/main/res/mipmap-anydpi-v26/check_mark_black.xml
  48. 5 0
      app/src/main/res/mipmap-anydpi-v26/check_mark_black_round.xml
  49. 5 0
      app/src/main/res/mipmap-anydpi-v26/check_mark_round.xml
  50. 5 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  51. 5 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  52. 5 0
      app/src/main/res/mipmap-anydpi-v26/mask_group.xml
  53. 5 0
      app/src/main/res/mipmap-anydpi-v26/mask_group_round.xml
  54. BIN
      app/src/main/res/mipmap-hdpi/calendar.png
  55. BIN
      app/src/main/res/mipmap-hdpi/calendar_foreground.png
  56. BIN
      app/src/main/res/mipmap-hdpi/calendar_round.png
  57. BIN
      app/src/main/res/mipmap-hdpi/calendarblack.png
  58. BIN
      app/src/main/res/mipmap-hdpi/calendarblack_foreground.png
  59. BIN
      app/src/main/res/mipmap-hdpi/calendarblack_round.png
  60. BIN
      app/src/main/res/mipmap-hdpi/check_mark.png
  61. BIN
      app/src/main/res/mipmap-hdpi/check_mark_black.png
  62. BIN
      app/src/main/res/mipmap-hdpi/check_mark_black_foreground.png
  63. BIN
      app/src/main/res/mipmap-hdpi/check_mark_black_round.png
  64. BIN
      app/src/main/res/mipmap-hdpi/check_mark_foreground.png
  65. BIN
      app/src/main/res/mipmap-hdpi/check_mark_round.png
  66. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  67. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
  68. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  69. BIN
      app/src/main/res/mipmap-hdpi/mask_group.png
  70. BIN
      app/src/main/res/mipmap-hdpi/mask_group_foreground.png
  71. BIN
      app/src/main/res/mipmap-hdpi/mask_group_round.png
  72. BIN
      app/src/main/res/mipmap-mdpi/calendar.png
  73. BIN
      app/src/main/res/mipmap-mdpi/calendar_foreground.png
  74. BIN
      app/src/main/res/mipmap-mdpi/calendar_round.png
  75. BIN
      app/src/main/res/mipmap-mdpi/calendarblack.png
  76. BIN
      app/src/main/res/mipmap-mdpi/calendarblack_foreground.png
  77. BIN
      app/src/main/res/mipmap-mdpi/calendarblack_round.png
  78. BIN
      app/src/main/res/mipmap-mdpi/check_mark.png
  79. BIN
      app/src/main/res/mipmap-mdpi/check_mark_black.png
  80. BIN
      app/src/main/res/mipmap-mdpi/check_mark_black_foreground.png
  81. BIN
      app/src/main/res/mipmap-mdpi/check_mark_black_round.png
  82. BIN
      app/src/main/res/mipmap-mdpi/check_mark_foreground.png
  83. BIN
      app/src/main/res/mipmap-mdpi/check_mark_round.png
  84. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  85. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
  86. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  87. BIN
      app/src/main/res/mipmap-mdpi/mask_group.png
  88. BIN
      app/src/main/res/mipmap-mdpi/mask_group_foreground.png
  89. BIN
      app/src/main/res/mipmap-mdpi/mask_group_round.png
  90. BIN
      app/src/main/res/mipmap-xhdpi/calendar.png
  91. BIN
      app/src/main/res/mipmap-xhdpi/calendar_foreground.png
  92. BIN
      app/src/main/res/mipmap-xhdpi/calendar_round.png
  93. BIN
      app/src/main/res/mipmap-xhdpi/calendarblack.png
  94. BIN
      app/src/main/res/mipmap-xhdpi/calendarblack_foreground.png
  95. BIN
      app/src/main/res/mipmap-xhdpi/calendarblack_round.png
  96. BIN
      app/src/main/res/mipmap-xhdpi/check_mark.png
  97. BIN
      app/src/main/res/mipmap-xhdpi/check_mark_black.png
  98. BIN
      app/src/main/res/mipmap-xhdpi/check_mark_black_foreground.png
  99. BIN
      app/src/main/res/mipmap-xhdpi/check_mark_black_round.png
  100. 0 0
      app/src/main/res/mipmap-xhdpi/check_mark_foreground.png

+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+*.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

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+Do It

+ 116 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,116 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <codeStyleSettings language="XML">
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="4" />
+      </indentOptions>
+      <arrangement>
+        <rules>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:android</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:id</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>style</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>ANDROID_ATTRIBUTE_ORDER</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>.*</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+        </rules>
+      </arrangement>
+    </codeStyleSettings>
+  </code_scheme>
+</component>

+ 6 - 0
.idea/compiler.xml

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

+ 21 - 0
.idea/gradle.xml

@@ -0,0 +1,21 @@
+<?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="GRADLE" />
+        <option name="distributionType" value="DEFAULT_WRAPPED" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="1.8" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+        <option name="resolveModulePerSourceSet" value="false" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 25 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,25 @@
+<?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="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>

+ 68 - 0
.idea/misc.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DesignSurface">
+    <option name="filePathToZoomLevelMap">
+      <map>
+        <entry key="..\:/course/app/src/main/res/layout/activity_calendar.xml" value="0.2" />
+        <entry key="..\:/course/app/src/main/res/layout/activity_main.xml" value="0.176" />
+        <entry key="..\:/course/app/src/main/res/layout/activity_splash.xml" value="0.15715579710144928" />
+        <entry key="..\:/course/app/src/main/res/layout/new_task.xml" value="0.15715579710144928" />
+        <entry key="..\:/course/app/src/main/res/layout/task_layout.xml" value="0.15715579710144928" />
+        <entry key="..\:/course/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.15989583333333332" />
+        <entry key="..\:/course/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml" value="0.15989583333333332" />
+      </map>
+    </option>
+  </component>
+  <component name="NullableNotNullManager">
+    <option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
+    <option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
+    <option name="myNullables">
+      <value>
+        <list size="15">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
+          <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
+          <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+          <item index="6" class="java.lang.String" itemvalue="android.annotation.Nullable" />
+          <item index="7" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+          <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="com.android.annotations.Nullable" />
+          <item index="12" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
+          <item index="13" class="java.lang.String" itemvalue="io.reactivex.annotations.Nullable" />
+          <item index="14" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.Nullable" />
+        </list>
+      </value>
+    </option>
+    <option name="myNotNulls">
+      <value>
+        <list size="15">
+          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
+          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
+          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
+          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+          <item index="5" class="java.lang.String" itemvalue="android.annotation.NonNull" />
+          <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+          <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="com.android.annotations.NonNull" />
+          <item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
+          <item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.NonNull" />
+          <item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.NonNull" />
+          <item index="14" class="java.lang.String" itemvalue="lombok.NonNull" />
+        </list>
+      </value>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" 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>

+ 6 - 0
.idea/vcs.xml

@@ -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>

+ 1 - 0
app/.gitignore

@@ -0,0 +1 @@
+/build

+ 34 - 0
app/build.gradle

@@ -0,0 +1,34 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 29
+
+    defaultConfig {
+        applicationId "net.penguincoders.doit"
+        minSdkVersion 23
+        targetSdkVersion 29
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    implementation fileTree(dir: "libs", include: ["*.jar"])
+    implementation 'androidx.appcompat:appcompat:1.1.0'
+    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+    implementation 'androidx.recyclerview:recyclerview:1.1.0'
+    implementation 'com.google.android.material:material:1.1.0'
+
+}

+ 21 - 0
app/proguard-rules.pro

@@ -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

BIN
app/release/app-release.apk


+ 20 - 0
app/release/output-metadata.json

@@ -0,0 +1,20 @@
+{
+  "version": 1,
+  "artifactType": {
+    "type": "APK",
+    "kind": "Directory"
+  },
+  "applicationId": "net.penguincoders.doit",
+  "variantName": "release",
+  "elements": [
+    {
+      "type": "SINGLE",
+      "filters": [],
+      "properties": [],
+      "versionCode": 1,
+      "versionName": "1.0",
+      "enabled": true,
+      "outputFile": "app-release.apk"
+    }
+  ]
+}

+ 26 - 0
app/src/androidTest/java/net/penguincoders/doit/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package net.penguincoders.doit;
+
+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("net.penguincoders.doit", appContext.getPackageName());
+    }
+}

+ 25 - 0
app/src/main/AndroidManifest.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="net.penguincoders.doit">
+
+    <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/AppTheme">
+        <activity
+            android:name=".CalendarActivity"
+            android:exported="false" />
+        <activity android:name=".SplashActivity">
+            <intent-filter>
+                <category android:name="android.intent.category.LAUNCHER" />
+
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".MainActivity" />
+    </application>
+
+</manifest>

BIN
app/src/main/calendar-playstore.png


BIN
app/src/main/calendarblack-playstore.png


BIN
app/src/main/check_mark-playstore.png


BIN
app/src/main/check_mark_black-playstore.png


BIN
app/src/main/ic_launcher-playstore.png


+ 103 - 0
app/src/main/java/net/penguincoders/doit/Adapters/ToDoAdapter.java

@@ -0,0 +1,103 @@
+package net.penguincoders.doit.Adapters;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import net.penguincoders.doit.AddNewTask;
+import net.penguincoders.doit.MainActivity;
+import net.penguincoders.doit.Model.ToDoModel;
+import net.penguincoders.doit.R;
+import net.penguincoders.doit.Utils.DatabaseHandler;
+
+import java.util.List;
+
+public class ToDoAdapter extends RecyclerView.Adapter<ToDoAdapter.ViewHolder> {
+
+    private List<ToDoModel> todoList;
+    private DatabaseHandler db;
+    private MainActivity activity;
+
+    public ToDoAdapter(DatabaseHandler db, MainActivity activity) {
+        this.db = db;
+        this.activity = activity;
+    }
+
+    @NonNull
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View itemView = LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.task_layout, parent, false);
+        return new ViewHolder(itemView);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
+        db.openDatabase();
+
+        final ToDoModel item = todoList.get(position);
+        holder.task.setText(item.getTask());
+        holder.task.setChecked(toBoolean(item.getStatus()));
+        holder.task.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                if (isChecked) {
+                    db.updateStatus(item.getId(), 1);
+                } else {
+                    db.updateStatus(item.getId(), 0);
+                }
+            }
+        });
+    }
+
+    private boolean toBoolean(int n) {
+        return n != 0;
+    }
+
+    @Override
+    public int getItemCount() {
+        return todoList.size();
+    }
+
+    public Context getContext() {
+        return activity;
+    }
+
+    public void setTasks(List<ToDoModel> todoList) {
+        this.todoList = todoList;
+        notifyDataSetChanged();
+    }
+
+    public void deleteItem(int position) {
+        ToDoModel item = todoList.get(position);
+        db.deleteTask(item.getId());
+        todoList.remove(position);
+        notifyItemRemoved(position);
+    }
+
+    public void editItem(int position) {
+        ToDoModel item = todoList.get(position);
+        Bundle bundle = new Bundle();
+        bundle.putInt("id", item.getId());
+        bundle.putString("task", item.getTask());
+        AddNewTask fragment = new AddNewTask();
+        fragment.setArguments(bundle);
+        fragment.show(activity.getSupportFragmentManager(), AddNewTask.TAG);
+    }
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        CheckBox task;
+
+        ViewHolder(View view) {
+            super(view);
+            task = view.findViewById(R.id.todoCheckBox);
+        }
+    }
+}

+ 125 - 0
app/src/main/java/net/penguincoders/doit/AddNewTask.java

@@ -0,0 +1,125 @@
+package net.penguincoders.doit;
+
+import android.app.Activity;
+import android.content.DialogInterface;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+import net.penguincoders.doit.Adapters.ToDoAdapter;
+import net.penguincoders.doit.Model.ToDoModel;
+import net.penguincoders.doit.Utils.DatabaseHandler;
+
+import java.util.Objects;
+
+public class AddNewTask extends BottomSheetDialogFragment {
+
+    public static final String TAG = "ActionBottomDialog";
+    private EditText newTaskText;
+    private Button newTaskSaveButton;
+
+    private DatabaseHandler db;
+
+    public static AddNewTask newInstance(){
+        return new AddNewTask();
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NORMAL, R.style.DialogStyle);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+                             @Nullable Bundle savedInstanceState) {
+
+        View view = inflater.inflate(R.layout.new_task, container, false);
+        getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+
+        return view;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        newTaskText = Objects.requireNonNull(getView()).findViewById(R.id.newTaskText);
+        newTaskSaveButton = getView().findViewById(R.id.newTaskButton);
+
+        boolean isUpdate = false;
+
+        final Bundle bundle = getArguments();
+        if(bundle != null){
+            isUpdate = true;
+            String task = bundle.getString("task");
+            newTaskText.setText(task);
+            assert task != null;
+            if(task.length()>0)
+                newTaskSaveButton.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.colorPrimaryDark));
+        }
+
+        db = new DatabaseHandler(getActivity());
+        db.openDatabase();
+
+        newTaskText.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                if(s.toString().equals("")){
+                    newTaskSaveButton.setEnabled(false);
+                    newTaskSaveButton.setTextColor(Color.GRAY);
+                }
+                else{
+                    newTaskSaveButton.setEnabled(true);
+                    newTaskSaveButton.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.colorPrimaryDark));
+                }
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+            }
+        });
+
+        final boolean finalIsUpdate = isUpdate;
+        newTaskSaveButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String text = newTaskText.getText().toString();
+                if(finalIsUpdate){
+                    db.updateTask(bundle.getInt("id"), text);
+                }
+                else {
+                    ToDoModel task = new ToDoModel();
+                    task.setTask(text);
+                    task.setStatus(0);
+                    db.insertTask(task);
+                }
+                dismiss();
+            }
+        });
+    }
+
+    @Override
+    public void onDismiss(@NonNull DialogInterface dialog){
+        Activity activity = getActivity();
+        if(activity instanceof DialogCloseListener)
+            ((DialogCloseListener)activity).handleDialogClose(dialog);
+    }
+}

+ 27 - 0
app/src/main/java/net/penguincoders/doit/CalendarActivity.java

@@ -0,0 +1,27 @@
+package net.penguincoders.doit;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageButton;
+
+public class CalendarActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_calendar);
+
+        getSupportActionBar().hide();
+        ImageButton imageButton3 = findViewById(R.id.imageButton3);
+        imageButton3.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(CalendarActivity.this,MainActivity.class);
+                CalendarActivity.this.startActivity(intent);
+            }
+        });
+    }
+}

+ 7 - 0
app/src/main/java/net/penguincoders/doit/DialogCloseListener.java

@@ -0,0 +1,7 @@
+package net.penguincoders.doit;
+
+import android.content.DialogInterface;
+
+public interface DialogCloseListener {
+    public void handleDialogClose(DialogInterface dialog);
+}

+ 98 - 0
app/src/main/java/net/penguincoders/doit/MainActivity.java

@@ -0,0 +1,98 @@
+package net.penguincoders.doit;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.ItemTouchHelper;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CalendarView;
+import android.widget.ImageButton;
+
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+
+import net.penguincoders.doit.Adapters.ToDoAdapter;
+import net.penguincoders.doit.Model.ToDoModel;
+import net.penguincoders.doit.Utils.DatabaseHandler;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Objects;
+
+public class MainActivity extends AppCompatActivity implements DialogCloseListener{
+
+    CalendarView calendarView;
+
+    private DatabaseHandler db;
+
+    private RecyclerView tasksRecyclerView;
+    private ToDoAdapter tasksAdapter;
+    private FloatingActionButton fab;
+
+    private List<ToDoModel> taskList;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        calendarView=findViewById(R.id.calendar);
+
+        getSupportActionBar().hide();
+        ImageButton imageButton = findViewById(R.id.imageButton);
+        imageButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(MainActivity.this,CalendarActivity.class);
+                MainActivity.this.startActivity(intent);
+            }
+        });
+
+        Objects.requireNonNull(getSupportActionBar()).hide();
+
+        db = new DatabaseHandler(this);
+        db.openDatabase();
+
+        tasksRecyclerView = findViewById(R.id.tasksRecyclerView);
+        tasksRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        tasksAdapter = new ToDoAdapter(db,MainActivity.this);
+        tasksRecyclerView.setAdapter(tasksAdapter);
+
+        ItemTouchHelper itemTouchHelper = new
+                ItemTouchHelper(new RecyclerItemTouchHelper(tasksAdapter));
+        itemTouchHelper.attachToRecyclerView(tasksRecyclerView);
+
+        fab = findViewById(R.id.fab);
+
+        taskList = db.getAllTasks();
+        Collections.reverse(taskList);
+
+        tasksAdapter.setTasks(taskList);
+
+        fab.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                AddNewTask.newInstance().show(getSupportFragmentManager(), AddNewTask.TAG);
+            }
+        });
+    }
+
+    @Override
+    public void handleDialogClose(DialogInterface dialog){
+        taskList = db.getAllTasks();
+        Collections.reverse(taskList);
+        tasksAdapter.setTasks(taskList);
+        tasksAdapter.notifyDataSetChanged();
+    }
+}

+ 30 - 0
app/src/main/java/net/penguincoders/doit/Model/ToDoModel.java

@@ -0,0 +1,30 @@
+package net.penguincoders.doit.Model;
+
+public class ToDoModel {
+    private int id, status;
+    private String task;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public String getTask() {
+        return task;
+    }
+
+    public void setTask(String task) {
+        this.task = task;
+    }
+}

+ 104 - 0
app/src/main/java/net/penguincoders/doit/RecyclerItemTouchHelper.java

@@ -0,0 +1,104 @@
+package net.penguincoders.doit;
+
+import android.content.DialogInterface;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.ItemTouchHelper;
+import androidx.recyclerview.widget.RecyclerView;
+
+import net.penguincoders.doit.Adapters.ToDoAdapter;
+
+public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback {
+
+    private ToDoAdapter adapter;
+
+    public RecyclerItemTouchHelper(ToDoAdapter adapter) {
+        super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
+        this.adapter = adapter;
+    }
+
+
+    @Override
+    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
+        return false;
+    }
+
+    @Override
+    public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, int direction) {
+        final int position = viewHolder.getAdapterPosition();
+        if (direction == ItemTouchHelper.LEFT) {
+            AlertDialog.Builder builder = new AlertDialog.Builder(adapter.getContext());
+            builder.setTitle("Удалить задачу");
+            builder.setMessage("Вы уверены, что хотите удалить эту задачу?");
+            builder.setPositiveButton("Подтвердить",
+                    new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            adapter.deleteItem(position);
+                        }
+                    });
+            builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+                    adapter.notifyItemChanged(viewHolder.getAdapterPosition());
+                }
+            });
+            AlertDialog dialog = builder.create();
+            dialog.show();
+        } else {
+            adapter.editItem(position);
+        }
+    }
+
+    @Override
+    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
+        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
+
+        Drawable icon;
+        ColorDrawable background;
+
+        View itemView = viewHolder.itemView;
+        int backgroundCornerOffset = 20;
+
+        if (dX > 0) {
+            icon = ContextCompat.getDrawable(adapter.getContext(), R.drawable.ic_baseline_edit);
+            background = new ColorDrawable(ContextCompat.getColor(adapter.getContext(), R.color.colorPrimaryDark));
+        } else {
+            icon = ContextCompat.getDrawable(adapter.getContext(), R.drawable.ic_baseline_delete);
+            background = new ColorDrawable(Color.RED);
+        }
+
+        assert icon != null;
+        int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
+        int iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
+        int iconBottom = iconTop + icon.getIntrinsicHeight();
+
+        if (dX > 0) { // Swiping to the right
+            int iconLeft = itemView.getLeft() + iconMargin;
+            int iconRight = itemView.getLeft() + iconMargin + icon.getIntrinsicWidth();
+            icon.setBounds(iconLeft, iconTop, iconRight, iconBottom);
+
+            background.setBounds(itemView.getLeft(), itemView.getTop(),
+                    itemView.getLeft() + ((int) dX) + backgroundCornerOffset, itemView.getBottom());
+        } else if (dX < 0) { // Swiping to the left
+            int iconLeft = itemView.getRight() - iconMargin - icon.getIntrinsicWidth();
+            int iconRight = itemView.getRight() - iconMargin;
+            icon.setBounds(iconLeft, iconTop, iconRight, iconBottom);
+
+            background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset,
+                    itemView.getTop(), itemView.getRight(), itemView.getBottom());
+        } else { // view is unSwiped
+            background.setBounds(0, 0, 0, 0);
+        }
+
+        background.draw(c);
+        icon.draw(c);
+    }
+}

+ 26 - 0
app/src/main/java/net/penguincoders/doit/SplashActivity.java

@@ -0,0 +1,26 @@
+package net.penguincoders.doit;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+
+public class SplashActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_splash);
+        getSupportActionBar().hide();
+
+        final Intent i = new Intent(SplashActivity.this, MainActivity.class);
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                startActivity(i);
+                finish();
+            }
+        }, 2000);
+    }
+}

+ 97 - 0
app/src/main/java/net/penguincoders/doit/Utils/DatabaseHandler.java

@@ -0,0 +1,97 @@
+package net.penguincoders.doit.Utils;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import net.penguincoders.doit.Model.ToDoModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DatabaseHandler extends SQLiteOpenHelper {
+
+    private static final int VERSION = 1;
+    private static final String NAME = "toDoListDatabase";
+    private static final String TODO_TABLE = "todo";
+    private static final String ID = "id";
+    private static final String TASK = "task";
+    private static final String STATUS = "status";
+    private static final String CREATE_TODO_TABLE = "CREATE TABLE " + TODO_TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + TASK + " TEXT, "
+            + STATUS + " INTEGER)";
+
+    private SQLiteDatabase db;
+
+    public DatabaseHandler(Context context) {
+        super(context, NAME, null, VERSION);
+    }
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        db.execSQL(CREATE_TODO_TABLE);
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        // Drop older table if existed
+        db.execSQL("DROP TABLE IF EXISTS " + TODO_TABLE);
+        // Create tables again
+        onCreate(db);
+    }
+
+    public void openDatabase() {
+        db = this.getWritableDatabase();
+    }
+
+    public void insertTask(ToDoModel task){
+        ContentValues cv = new ContentValues();
+        cv.put(TASK, task.getTask());
+        cv.put(STATUS, 0);
+        db.insert(TODO_TABLE, null, cv);
+    }
+
+    public List<ToDoModel> getAllTasks(){
+        List<ToDoModel> taskList = new ArrayList<>();
+        Cursor cur = null;
+        db.beginTransaction();
+        try{
+            cur = db.query(TODO_TABLE, null, null, null, null, null, null, null);
+            if(cur != null){
+                if(cur.moveToFirst()){
+                    do{
+                        ToDoModel task = new ToDoModel();
+                        task.setId(cur.getInt(cur.getColumnIndex(ID)));
+                        task.setTask(cur.getString(cur.getColumnIndex(TASK)));
+                        task.setStatus(cur.getInt(cur.getColumnIndex(STATUS)));
+                        taskList.add(task);
+                    }
+                    while(cur.moveToNext());
+                }
+            }
+        }
+        finally {
+            db.endTransaction();
+            assert cur != null;
+            cur.close();
+        }
+        return taskList;
+    }
+
+    public void updateStatus(int id, int status){
+        ContentValues cv = new ContentValues();
+        cv.put(STATUS, status);
+        db.update(TODO_TABLE, cv, ID + "= ?", new String[] {String.valueOf(id)});
+    }
+
+    public void updateTask(int id, String task) {
+        ContentValues cv = new ContentValues();
+        cv.put(TASK, task);
+        db.update(TODO_TABLE, cv, ID + "= ?", new String[] {String.valueOf(id)});
+    }
+
+    public void deleteTask(int id){
+        db.delete(TODO_TABLE, ID + "= ?", new String[] {String.valueOf(id)});
+    }
+}

BIN
app/src/main/mask_group-playstore.png


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 30 - 0
app/src/main/res/drawable-v24/ic_launcher_foreground.xml


+ 5 - 0
app/src/main/res/drawable/ic_baseline_add_24.xml

@@ -0,0 +1,5 @@
+<vector android:height="32dp" android:tint="#FFFFFF"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+</vector>

+ 5 - 0
app/src/main/res/drawable/ic_baseline_delete.xml

@@ -0,0 +1,5 @@
+<vector android:height="36dp" android:tint="#FFFFFF"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="36dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
+</vector>

+ 5 - 0
app/src/main/res/drawable/ic_baseline_edit.xml

@@ -0,0 +1,5 @@
+<vector android:height="32dp" android:tint="#FFFFFF"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
+</vector>

BIN
app/src/main/res/drawable/logo.png


+ 80 - 0
app/src/main/res/layout/activity_calendar.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#FFFFFF"
+    android:backgroundTint="#FFFFFF"
+    tools:context=".CalendarActivity">
+
+
+    <CalendarView
+        android:id="@+id/calendar"
+        android:layout_width="match_parent"
+        android:layout_height="325dp"
+        android:layout_centerInParent="true"
+        android:backgroundTint="#483B2B"
+        android:focusedMonthDateColor="#FFFFFF"
+        android:selectedWeekBackgroundColor="#483B2B" />
+
+
+    <TextView
+        android:id="@+id/textView"
+        android:layout_width="169dp"
+        android:layout_height="49dp"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:layout_marginLeft="23dp"
+        android:layout_marginTop="24dp"
+        android:text="Календарь"
+        android:textColor="@android:color/black"
+        android:textSize="32sp"
+        android:textStyle="bold" />
+
+    <ImageView
+        android:id="@+id/imageView3"
+        android:layout_width="82dp"
+        android:layout_height="78dp"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginEnd="90dp"
+        android:layout_marginBottom="31dp"
+        app:srcCompat="@mipmap/calendar_foreground" />
+
+    <TextView
+        android:id="@+id/textView3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginEnd="98dp"
+        android:layout_marginBottom="31dp"
+        android:text="Календарь"
+        android:textColor="#483B2B" />
+
+    <ImageButton
+        android:id="@+id/imageButton3"
+        android:layout_width="84dp"
+        android:layout_height="76dp"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="90dp"
+        android:layout_marginBottom="31dp"
+        android:backgroundTint="#FFFFFF"
+        app:srcCompat="@mipmap/check_mark_black_foreground"
+        tools:ignore="SpeakableTextPresentCheck" />
+
+    <TextView
+        android:id="@+id/textView2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="103dp"
+        android:layout_marginBottom="32dp"
+        android:text="Задачи"
+        android:textColor="#000000" />
+
+
+</RelativeLayout>

+ 88 - 0
app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#FFFFFF">
+
+    <TextView
+        android:id="@+id/tasksText"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp"
+        android:text="Задача"
+        android:textColor="@android:color/black"
+        android:textSize="32sp"
+        android:textStyle="bold" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/tasksRecyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/tasksText"
+        android:nestedScrollingEnabled="true"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
+
+
+    <com.google.android.material.floatingactionbutton.FloatingActionButton
+        android:id="@+id/fab"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginStart="32dp"
+        android:layout_marginTop="32dp"
+        android:layout_marginEnd="49dp"
+        android:layout_marginBottom="133dp"
+        android:backgroundTint="@color/colorPrimaryDark"
+        android:src="@drawable/ic_baseline_add_24"
+        tools:ignore="SpeakableTextPresentCheck" />
+
+    <ImageView
+        android:id="@+id/imageView2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="90dp"
+        android:layout_marginBottom="31dp"
+        app:srcCompat="@mipmap/check_mark" />
+
+    <ImageButton
+        android:id="@+id/imageButton"
+        android:layout_width="72dp"
+        android:layout_height="74dp"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginEnd="90dp"
+        android:layout_marginBottom="31dp"
+        android:backgroundTint="#FFFFFF"
+        app:srcCompat="@mipmap/calendarblack_foreground"
+        tools:ignore="SpeakableTextPresentCheck" />
+
+    <TextView
+        android:id="@+id/textView3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginEnd="99dp"
+        android:layout_marginBottom="30dp"
+        android:text="Календарь"
+        android:textColor="#000000" />
+
+    <TextView
+        android:id="@+id/textView2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="102dp"
+        android:layout_marginBottom="30dp"
+        android:text="Задачи"
+        android:textColor="#483B2B" />
+
+</RelativeLayout>

+ 14 - 0
app/src/main/res/layout/activity_splash.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/colorPrimary">
+
+    <ImageView
+        android:id="@+id/imageView"
+        android:layout_width="300dp"
+        android:layout_height="300dp"
+        android:layout_centerInParent="true"
+        app:srcCompat="@mipmap/mask_group_foreground" />
+</RelativeLayout>

+ 27 - 0
app/src/main/res/layout/new_task.xml

@@ -0,0 +1,27 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="16dp">
+
+    <EditText
+        android:id="@+id/newTaskText"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@null"
+        android:hint="Новая задача"
+        android:minHeight="48dp"
+        android:textAppearance="@style/TextAppearance.AppCompat.Medium" />
+
+    <Button
+        android:id="@+id/newTaskButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/newTaskText"
+        android:layout_alignParentEnd="true"
+        android:background="@android:color/transparent"
+        android:text="Сохранить"
+        android:textAllCaps="false"
+        android:textColor="@android:color/darker_gray"
+        android:textSize="16sp" />
+
+</RelativeLayout>

+ 28 - 0
app/src/main/res/layout/task_layout.xml

@@ -0,0 +1,28 @@
+<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    app:cardElevation="4dp"
+    app:cardCornerRadius="8dp"
+    android:layout_marginHorizontal="16dp"
+    android:layout_marginVertical="8dp">
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="8dp">
+
+        <CheckBox
+            android:id="@+id/todoCheckBox"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:buttonTint="@color/colorPrimaryDark"
+            android:minHeight="48dp"
+            android:paddingStart="8dp"
+            tools:text="Go to the market and bring vegetables immediately today." />
+
+    </RelativeLayout>
+
+</androidx.cardview.widget.CardView>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/calendar.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/calendar_background"/>
+    <foreground android:drawable="@mipmap/calendar_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/calendar_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/calendar_background"/>
+    <foreground android:drawable="@mipmap/calendar_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/calendarblack.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/calendarblack_background"/>
+    <foreground android:drawable="@mipmap/calendarblack_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/calendarblack_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/calendarblack_background"/>
+    <foreground android:drawable="@mipmap/calendarblack_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/check_mark.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/check_mark_background"/>
+    <foreground android:drawable="@mipmap/check_mark_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/check_mark_black.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/check_mark_black_background"/>
+    <foreground android:drawable="@mipmap/check_mark_black_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/check_mark_black_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/check_mark_black_background"/>
+    <foreground android:drawable="@mipmap/check_mark_black_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/check_mark_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/check_mark_background"/>
+    <foreground android:drawable="@mipmap/check_mark_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/ic_launcher_background"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/ic_launcher_background"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/mask_group.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/mask_group_background"/>
+    <foreground android:drawable="@mipmap/mask_group_foreground"/>
+</adaptive-icon>

+ 5 - 0
app/src/main/res/mipmap-anydpi-v26/mask_group_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/mask_group_background"/>
+    <foreground android:drawable="@mipmap/mask_group_foreground"/>
+</adaptive-icon>

BIN
app/src/main/res/mipmap-hdpi/calendar.png


BIN
app/src/main/res/mipmap-hdpi/calendar_foreground.png


BIN
app/src/main/res/mipmap-hdpi/calendar_round.png


BIN
app/src/main/res/mipmap-hdpi/calendarblack.png


BIN
app/src/main/res/mipmap-hdpi/calendarblack_foreground.png


BIN
app/src/main/res/mipmap-hdpi/calendarblack_round.png


BIN
app/src/main/res/mipmap-hdpi/check_mark.png


BIN
app/src/main/res/mipmap-hdpi/check_mark_black.png


BIN
app/src/main/res/mipmap-hdpi/check_mark_black_foreground.png


BIN
app/src/main/res/mipmap-hdpi/check_mark_black_round.png


BIN
app/src/main/res/mipmap-hdpi/check_mark_foreground.png


BIN
app/src/main/res/mipmap-hdpi/check_mark_round.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-hdpi/mask_group.png


BIN
app/src/main/res/mipmap-hdpi/mask_group_foreground.png


BIN
app/src/main/res/mipmap-hdpi/mask_group_round.png


BIN
app/src/main/res/mipmap-mdpi/calendar.png


BIN
app/src/main/res/mipmap-mdpi/calendar_foreground.png


BIN
app/src/main/res/mipmap-mdpi/calendar_round.png


BIN
app/src/main/res/mipmap-mdpi/calendarblack.png


BIN
app/src/main/res/mipmap-mdpi/calendarblack_foreground.png


BIN
app/src/main/res/mipmap-mdpi/calendarblack_round.png


BIN
app/src/main/res/mipmap-mdpi/check_mark.png


BIN
app/src/main/res/mipmap-mdpi/check_mark_black.png


BIN
app/src/main/res/mipmap-mdpi/check_mark_black_foreground.png


BIN
app/src/main/res/mipmap-mdpi/check_mark_black_round.png


BIN
app/src/main/res/mipmap-mdpi/check_mark_foreground.png


BIN
app/src/main/res/mipmap-mdpi/check_mark_round.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
app/src/main/res/mipmap-mdpi/mask_group.png


BIN
app/src/main/res/mipmap-mdpi/mask_group_foreground.png


BIN
app/src/main/res/mipmap-mdpi/mask_group_round.png


BIN
app/src/main/res/mipmap-xhdpi/calendar.png


BIN
app/src/main/res/mipmap-xhdpi/calendar_foreground.png


BIN
app/src/main/res/mipmap-xhdpi/calendar_round.png


BIN
app/src/main/res/mipmap-xhdpi/calendarblack.png


BIN
app/src/main/res/mipmap-xhdpi/calendarblack_foreground.png


BIN
app/src/main/res/mipmap-xhdpi/calendarblack_round.png


BIN
app/src/main/res/mipmap-xhdpi/check_mark.png


BIN
app/src/main/res/mipmap-xhdpi/check_mark_black.png


BIN
app/src/main/res/mipmap-xhdpi/check_mark_black_foreground.png


BIN
app/src/main/res/mipmap-xhdpi/check_mark_black_round.png


+ 0 - 0
app/src/main/res/mipmap-xhdpi/check_mark_foreground.png


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác