11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Photos/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/1.png
--------------------------------------------------------------------------------
/Photos/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/10.png
--------------------------------------------------------------------------------
/Photos/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/11.png
--------------------------------------------------------------------------------
/Photos/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/12.png
--------------------------------------------------------------------------------
/Photos/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/2.png
--------------------------------------------------------------------------------
/Photos/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/3.png
--------------------------------------------------------------------------------
/Photos/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/4.png
--------------------------------------------------------------------------------
/Photos/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/5.png
--------------------------------------------------------------------------------
/Photos/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/6.png
--------------------------------------------------------------------------------
/Photos/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/7.png
--------------------------------------------------------------------------------
/Photos/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/8.png
--------------------------------------------------------------------------------
/Photos/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/9.png
--------------------------------------------------------------------------------
/Photos/Minitask-feature-graphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/Minitask-feature-graphic.png
--------------------------------------------------------------------------------
/Photos/minitask_land.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/Photos/minitask_land.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Minitask
2 | [](https://github.com/ellerbrock/open-source-badges/)
3 |
4 | 
5 |
6 | ## About
7 | Minitask is a mini, lightweight (<5MB), and simple app for reminders/ todo list/ task management. The app is simple with very basic functions like task list, date time reminder and features a beautiful, efficient UI. I made Minitask while I was learning Android Development. There has been various apps of the same function on the PlayStore, but making this app enables me to sharpen my Android skills and implement my idea.
8 | Redlor: I am taking on the development of this app from November 2017. The aim is to switch to Firebase from SQLite and make some enhancements. I need help with issues in the Issues section and translations and any kind of suggestion are very welcome.
9 |
10 | ## Download
11 |
12 |
13 |
14 | Actually on Open Beta testing.
15 |
16 |
17 | ## Screenshot
18 |
19 |
20 | ## Contributing
21 | PRs and discussions are welcomed. Translation is also appreciated.
22 |
23 | Contributors:
24 |
25 | https://github.com/LewisVo (original developer)
26 |
27 | https://github.com/danielblokus
28 |
29 | Translations:
30 |
31 | Italian: https://github.com/redlor
32 |
33 | Polish: https://github.com/danielblokus
34 |
35 | French: https://github.com/Bradzer
36 |
37 | Portuguese: https://github.com/rickpms
38 |
39 | ## App icon credit
40 | https://www.flaticon.com/free-icon/startup_341435#term=rocket&page=2&position=33
41 | https://www.flaticon.com/free-icon/rocket_122111#term=rocket&page=2&position=62
42 |
43 | ## License
44 | Apache License Ver 2.0
45 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 26
5 | buildToolsVersion '26.0.2'
6 | defaultConfig {
7 | applicationId "redlor.it.minitask"
8 | minSdkVersion 16
9 | targetSdkVersion 26
10 | versionCode 5
11 | versionName "Beta 1.1"
12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(dir: 'libs', include: ['*.jar'])
24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
25 | exclude group: 'com.android.support', module: 'support-annotations'
26 | })
27 | compile 'com.google.firebase:firebase-database:11.4.2'
28 | compile 'com.firebaseui:firebase-ui-database:3.1.0'
29 | compile 'com.google.firebase:firebase-auth:11.4.2'
30 | compile 'com.firebaseui:firebase-ui-auth:3.1.0'
31 | // compile 'com.facebook.android:facebook-android-sdk:4.14.1'
32 |
33 |
34 |
35 |
36 |
37 | compile 'com.android.support.constraint:constraint-layout:1.0.2'
38 | compile 'com.jpardogo.materialtabstrip:library:1.1.1'
39 |
40 | compile 'com.android.support:appcompat-v7:26+'
41 | compile 'com.android.support:support-v4:26+'
42 | compile 'com.android.support:design:26+'
43 |
44 |
45 | compile 'com.jakewharton:butterknife:8.7.0'
46 | compile 'com.rengwuxian.materialedittext:library:2.1.4'
47 | compile 'com.wdullaer:materialdatetimepicker:3.4.0'
48 |
49 | implementation 'com.facebook.android:facebook-login:4.27.0'
50 |
51 | testCompile 'junit:junit:4.12'
52 | testCompile 'com.facebook.android:facebook-login:4.27.0'
53 | annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'
54 | }
55 |
56 |
57 | apply plugin: 'com.google.gms.google-services'
--------------------------------------------------------------------------------
/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "422715163795",
4 | "firebase_url": "https://minitask-ba58f.firebaseio.com",
5 | "project_id": "minitask-ba58f",
6 | "storage_bucket": "minitask-ba58f.appspot.com"
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "1:422715163795:android:4f5551902bb0e252",
12 | "android_client_info": {
13 | "package_name": "redlor.it.minitask"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "422715163795-30p402jee2ll016js3s59k03nen67fnj.apps.googleusercontent.com",
19 | "client_type": 1,
20 | "android_info": {
21 | "package_name": "redlor.it.minitask",
22 | "certificate_hash": "d2d65ecd6b1d5686e87b306e177100acce18b8f8"
23 | }
24 | },
25 | {
26 | "client_id": "422715163795-fkjv8fpkat634vo8b36m7ql7ljn33m93.apps.googleusercontent.com",
27 | "client_type": 1,
28 | "android_info": {
29 | "package_name": "redlor.it.minitask",
30 | "certificate_hash": "f301baf1e430fab2db5020c9f88ef94fcff86c93"
31 | }
32 | },
33 | {
34 | "client_id": "422715163795-vbjr8p32l9qqdu2hhfpjkl58d3cu0f76.apps.googleusercontent.com",
35 | "client_type": 3
36 | }
37 | ],
38 | "api_key": [
39 | {
40 | "current_key": "AIzaSyAyrrrGR640oc8X32GQ8pm8ZFEiumwFjbw"
41 | }
42 | ],
43 | "services": {
44 | "analytics_service": {
45 | "status": 1
46 | },
47 | "appinvite_service": {
48 | "status": 2,
49 | "other_platform_oauth_client": [
50 | {
51 | "client_id": "422715163795-vbjr8p32l9qqdu2hhfpjkl58d3cu0f76.apps.googleusercontent.com",
52 | "client_type": 3
53 | }
54 | ]
55 | },
56 | "ads_service": {
57 | "status": 2
58 | }
59 | }
60 | }
61 | ],
62 | "configuration_version": "1"
63 | }
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /home/luongvo/Android/Sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 | # Uncomment this to preserve the line number information for
20 | # debugging stack traces.
21 | #-keepattributes SourceFile,LineNumberTable
22 |
23 | # If you keep the line number information, uncomment this to
24 | # hide the original source file name.
25 | #-renamesourcefileattribute SourceFile
26 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/luongvo/com/todolistminimal/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package luongvo.com.todolistminimal;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.assertEquals;
11 |
12 | /**
13 | * Instrumentation test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("luongvo.com.todolistminimal", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/luongvo/com/todolistminimal/Pages/AddTask.java:
--------------------------------------------------------------------------------
1 | package luongvo.com.todolistminimal.Pages;
2 |
3 | import luongvo.com.todolistminimal.R;
4 |
5 | import static android.support.test.espresso.Espresso.onView;
6 | import static android.support.test.espresso.action.ViewActions.click;
7 | import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
8 | import static android.support.test.espresso.action.ViewActions.replaceText;
9 | import static android.support.test.espresso.assertion.ViewAssertions.matches;
10 | import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
11 | import static android.support.test.espresso.matcher.ViewMatchers.withId;
12 | import static org.hamcrest.Matchers.allOf;
13 | import static org.hamcrest.Matchers.notNullValue;
14 |
15 | /**
16 | * Created by Daniel Blokus on 30.09.2017.
17 | */
18 |
19 | public class AddTask {
20 |
21 | public static final String TASK_NAME = "test";
22 |
23 | public AddTask() {
24 | onView(allOf(withId(R.id.todoInput)))
25 | .check(matches(notNullValue()))
26 | .check(matches(isDisplayed()));
27 | }
28 |
29 | public Home addTask() {
30 | isTaskNameInputDisplayed();
31 | fillTaskName();
32 | closeSoftKeyboard();
33 | isAddButtonDisplayed();
34 | clickAddButton();
35 | return new Home();
36 | }
37 |
38 | private void isTaskNameInputDisplayed() {
39 | onView(allOf(withId(R.id.todoEditText), isDisplayed()));
40 | }
41 |
42 | private void fillTaskName() {
43 | onView((withId(R.id.todoEditText)))
44 | .perform(replaceText(TASK_NAME));
45 | }
46 |
47 | private void isAddButtonDisplayed() {
48 | onView(withId(R.id.addTodoBtn))
49 | .check(matches(notNullValue()))
50 | .check(matches(isDisplayed()));
51 | }
52 |
53 | private void clickAddButton() {
54 | onView(withId(R.id.addTodoBtn))
55 | .perform(click());
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/luongvo/com/todolistminimal/Pages/Home.java:
--------------------------------------------------------------------------------
1 | package luongvo.com.todolistminimal.Pages;
2 |
3 | import luongvo.com.todolistminimal.R;
4 |
5 | import static android.support.test.espresso.Espresso.onView;
6 | import static android.support.test.espresso.action.ViewActions.click;
7 | import static android.support.test.espresso.assertion.ViewAssertions.matches;
8 | import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
9 | import static android.support.test.espresso.matcher.ViewMatchers.withId;
10 | import static org.hamcrest.Matchers.allOf;
11 | import static org.hamcrest.Matchers.notNullValue;
12 |
13 | /**
14 | * Created by Daniel Blokus on 30.09.2017.
15 | */
16 |
17 | public class Home {
18 |
19 | public Home(){
20 | onView(allOf(withId(R.id.action_bar)))
21 | .check(matches(notNullValue())).check(matches(isDisplayed()));
22 | }
23 |
24 | public AddTask navigateToAddTask() {
25 | onView(allOf(withId(R.id.actionButton))).perform(click());
26 | return new AddTask();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/luongvo/com/todolistminimal/TasksTest.java:
--------------------------------------------------------------------------------
1 | package luongvo.com.todolistminimal;
2 |
3 | import android.support.test.rule.ActivityTestRule;
4 | import android.support.test.runner.AndroidJUnit4;
5 |
6 | import org.junit.Rule;
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import luongvo.com.todolistminimal.Pages.Home;
11 |
12 | import static luongvo.com.todolistminimal.Pages.AddTask.TASK_NAME;
13 | import static luongvo.com.todolistminimal.Utils.CustomAssertions.shouldDisplayNewTaskInTheList;
14 |
15 | /**
16 | * Created by Daniel Blokus on 30.09.2017.
17 | */
18 |
19 | @RunWith(AndroidJUnit4.class)
20 | public class TasksTest {
21 | @Rule
22 | public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
23 |
24 | @Test
25 | public void createDefaultTask_ShouldDisplayHomeView() {
26 | new Home().navigateToAddTask().addTask();
27 | shouldDisplayNewTaskInTheList(TASK_NAME);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/luongvo/com/todolistminimal/Utils/CustomAssertions.java:
--------------------------------------------------------------------------------
1 | package luongvo.com.todolistminimal.Utils;
2 |
3 | import android.support.test.espresso.ViewInteraction;
4 | import android.view.View;
5 | import android.view.ViewGroup;
6 | import android.view.ViewParent;
7 |
8 | import org.hamcrest.Description;
9 | import org.hamcrest.Matcher;
10 | import org.hamcrest.TypeSafeMatcher;
11 |
12 | import luongvo.com.todolistminimal.R;
13 |
14 | import static android.support.test.espresso.Espresso.onView;
15 | import static android.support.test.espresso.assertion.ViewAssertions.matches;
16 | import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
17 | import static android.support.test.espresso.matcher.ViewMatchers.withId;
18 | import static android.support.test.espresso.matcher.ViewMatchers.withText;
19 | import static org.hamcrest.Matchers.allOf;
20 |
21 | /**
22 | * Created by Daniel Blokus on 30.09.2017.
23 | */
24 |
25 | public class CustomAssertions {
26 |
27 | public static void shouldDisplayNewTaskInTheList(String taskName) {
28 | ViewInteraction textView = onView(
29 | allOf(withId(R.id.todoContent),
30 | childAtPosition(
31 | allOf(withId(R.id.taskList),
32 | childAtPosition(
33 | withId(R.id.todoList),
34 | 0)),
35 | 1),
36 | isDisplayed()));
37 | textView.check(matches(withText(taskName)));
38 | }
39 |
40 | private static Matcher childAtPosition(
41 | final Matcher parentMatcher, final int position) {
42 |
43 | return new TypeSafeMatcher() {
44 | @Override
45 | public void describeTo(Description description) {
46 | description.appendText("Child at position " + position + " in parent ");
47 | parentMatcher.describeTo(description);
48 | }
49 |
50 | @Override
51 | public boolean matchesSafely(View view) {
52 | ViewParent parent = view.getParent();
53 | return parent instanceof ViewGroup && parentMatcher.matches(parent)
54 | && view.equals(((ViewGroup) parent).getChildAt(position));
55 | }
56 | };
57 | }
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
16 |
17 |
19 |
20 |
21 |
22 |
23 |
24 |
27 |
28 |
29 |
32 |
33 |
34 |
35 |
36 |
38 |
39 |
40 |
43 |
44 |
45 |
47 |
48 |
50 |
51 |
52 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/ic_launcher-web.png
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/AboutActivity.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 |
6 | public class AboutActivity extends AppCompatActivity {
7 |
8 | @Override
9 | protected void onCreate(Bundle savedInstanceState) {
10 | setTheme(R.style.AppTheme);
11 | super.onCreate(savedInstanceState);
12 | setContentView(R.layout.activity_about);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/Adapters/MyFragmentPagerAdapter.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask.Adapters;
2 |
3 | import android.app.Activity;
4 | import android.support.v4.app.Fragment;
5 | import android.support.v4.app.FragmentManager;
6 | import android.support.v4.app.FragmentStatePagerAdapter;
7 |
8 | import redlor.it.minitask.PageFragment;
9 | import redlor.it.minitask.R;
10 | import redlor.it.minitask.TodayFragment;
11 | import redlor.it.minitask.WeekFragment;
12 |
13 | /**
14 | * Created by luongvo on 18/07/2017.
15 | */
16 |
17 | public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
18 | private static final int PAGE_COUNT = 3;
19 |
20 | private Activity myActivity;
21 |
22 | public MyFragmentPagerAdapter(FragmentManager fm, Activity activity) {
23 | super(fm);
24 | this.myActivity = activity;
25 | }
26 |
27 | @Override
28 | public Fragment getItem(int position) {
29 | switch (position) {
30 | case 0:
31 | PageFragment pageFragment = new PageFragment();
32 | return pageFragment;
33 | case 1:
34 | TodayFragment todayFragment = new TodayFragment();
35 | return todayFragment;
36 | case 2:
37 | WeekFragment weekFragment = new WeekFragment();
38 | return weekFragment;
39 | default:
40 | return null;
41 | }
42 | }
43 |
44 | @Override
45 | public int getCount() {
46 | return PAGE_COUNT;
47 | }
48 |
49 | @Override
50 | public CharSequence getPageTitle(int position) {
51 |
52 | switch (position) {
53 | case 0:
54 | return myActivity.getString(R.string.inbox);
55 | case 1:
56 | return myActivity.getString(R.string.today);
57 | case 2:
58 | return myActivity.getString(R.string.next_7_days);
59 | }
60 | return null;
61 |
62 | }
63 |
64 | @Override
65 | public int getItemPosition(Object object) {
66 | return POSITION_NONE;
67 | }
68 |
69 |
70 | }
71 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/DetailActivity.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.FragmentManager;
7 | import android.support.v7.app.AppCompatActivity;
8 |
9 | /**
10 | * Created by Redlor on 26/11/2017.
11 | * This class replaces @ DetailTodoItem in order to implement a fragment for Dual Pane mode
12 | */
13 |
14 | public class DetailActivity extends AppCompatActivity {
15 |
16 | String content;
17 | String reminder;
18 | Boolean hasReminder;
19 | Boolean done;
20 | String mItemId;
21 |
22 | @Override
23 | protected void onCreate(@Nullable Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.activity_detail);
26 |
27 | getSupportActionBar().setTitle(getString(R.string.detail));
28 |
29 | if (savedInstanceState == null) {
30 | DetailFragment detailFragment = new DetailFragment();
31 | FragmentManager fragmentManager = getSupportFragmentManager();
32 |
33 | getDataFromIntent();
34 |
35 | // Send data to the DetailFragment
36 | Bundle bundle = new Bundle();
37 | bundle.putString("content", content);
38 | bundle.putString("reminder", reminder);
39 | bundle.putBoolean("hasReminder", hasReminder);
40 | bundle.putBoolean("done", done);
41 | bundle.putString("itemId", mItemId);
42 | detailFragment.setArguments(bundle);
43 |
44 | fragmentManager.beginTransaction()
45 | .add(R.id.details_container, detailFragment)
46 | .commit();
47 |
48 | }
49 | }
50 |
51 | private void getDataFromIntent() {
52 | // because we go from main activity to here
53 | Intent intent = getIntent();
54 | content = intent.getStringExtra("content");
55 | reminder = intent.getStringExtra("reminder");
56 | hasReminder = intent.getExtras().getBoolean("hasReminder");
57 | done = intent.getExtras().getBoolean("done");
58 | mItemId = intent.getExtras().getString("itemId");
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/DetailFragment.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask;
2 |
3 | import android.app.Activity;
4 | import android.app.Dialog;
5 | import android.content.DialogInterface;
6 | import android.content.Intent;
7 | import android.os.Bundle;
8 | import android.support.annotation.Nullable;
9 | import android.support.design.widget.FloatingActionButton;
10 | import android.support.v4.app.Fragment;
11 | import android.support.v7.app.AlertDialog;
12 | import android.view.LayoutInflater;
13 | import android.view.View;
14 | import android.view.ViewGroup;
15 | import android.view.WindowManager;
16 | import android.widget.TextView;
17 |
18 | import butterknife.BindView;
19 | import butterknife.ButterKnife;
20 | import redlor.it.minitask.Utils.MyDateTimeUtils;
21 | import redlor.it.minitask.Utils.UpdateFirebase;
22 |
23 | /**
24 | * Created by Redlor on 26/11/2017.
25 | * This Fragment shows the details of an item.
26 | * In dual pane it is placed next to MainActivity
27 | */
28 |
29 | public class DetailFragment extends Fragment {
30 |
31 | @BindView(R.id.todoInfo)
32 | TextView todoInfo;
33 | @BindView(R.id.reminderInfo)
34 | TextView reminderInfo;
35 | @BindView(R.id.editTodoBtn)
36 | FloatingActionButton editTodo;
37 | @BindView(R.id.deleteTodoBtn)
38 | FloatingActionButton deleteTodo;
39 |
40 | String content;
41 | String reminder;
42 | Boolean hasReminder = true;
43 | Boolean done = false;
44 | String mItemId;
45 |
46 | MyDateTimeUtils dateTimeUtils; // util to do stuffs with notification
47 |
48 | // Declare the class with Firebase methods
49 | UpdateFirebase updateFirebase;
50 |
51 | ToDoItem currentToDoItem;
52 | private long oldRowId;
53 |
54 | /**
55 | * Mandatory empty constructor for the fragment manager to instantiate the fragment
56 | */
57 | public DetailFragment() {
58 | }
59 |
60 | // Prevent dialog dismiss when orientation changes.
61 | private static void doKeepDialog(Dialog dialog) {
62 | WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
63 | lp.copyFrom(dialog.getWindow().getAttributes());
64 | lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
65 | lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
66 | dialog.getWindow().setAttributes(lp);
67 | }
68 |
69 | @Nullable
70 | @Override
71 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
72 | getActivity().getSupportFragmentManager().beginTransaction().attach(this).commit();
73 | if (container == null) {
74 | return null;
75 | }
76 | // If the is rotated, get the existing data
77 | if (savedInstanceState != null) {
78 | content = savedInstanceState.getString("currentContent");
79 | reminder = savedInstanceState.getString("currentReminder");
80 | hasReminder = savedInstanceState.getBoolean("currenthasReminder");
81 | done = savedInstanceState.getBoolean("currentDone");
82 | mItemId = savedInstanceState.getString("currentItemId");
83 |
84 | // Otherwise get the data from the DetailActivity
85 | } else {
86 | Bundle bundle = new Bundle();
87 | bundle = getArguments();
88 | if (bundle != null) {
89 | content = bundle.getString("content");
90 | reminder = bundle.getString("reminder");
91 | hasReminder = bundle.getBoolean("hasReminder");
92 | done = bundle.getBoolean("done");
93 | mItemId = bundle.getString("itemId");
94 | }
95 | }
96 |
97 | View rootView = inflater.inflate(R.layout.fragment_detail, container, false);
98 | ButterKnife.bind(this, rootView);
99 |
100 | dateTimeUtils = new MyDateTimeUtils();
101 | assignComponents();
102 |
103 | return rootView;
104 | }
105 |
106 | private void assignComponents() {
107 | // update UI with the content taken from intent
108 | todoInfo.setText(content);
109 |
110 | if (hasReminder)
111 | reminderInfo.setText(reminder);
112 | else reminderInfo.setText(getString(R.string.not_found));
113 | // if edit button is press fire add activity with a little tweak
114 |
115 | if (content == null) {
116 | deleteTodo.setClickable(false);
117 | editTodo.setClickable(false);
118 | } else {
119 | // if delete is pressed then delete item in database and also remove object for notifydatsetchanged
120 | deleteTodo.setOnClickListener(new View.OnClickListener() {
121 | @Override
122 | public void onClick(View v) {
123 | AlertDialog alertDialog = new AlertDialog.Builder(getContext())
124 | .setIcon(android.R.drawable.ic_menu_delete)
125 | .setTitle(R.string.delete)
126 | .setMessage(R.string.delete_single_task_message)
127 | .setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() {
128 | @Override
129 | public void onClick(DialogInterface dialog, int which) {
130 | // Toast.makeText(getActivity(), R.string.item_deleted, Toast.LENGTH_SHORT).show();
131 |
132 | ToDoItem toDoItem = new ToDoItem(content, done, reminder, hasReminder, mItemId);
133 |
134 | // remove existing scheduled notification if existed
135 | if (!reminder.equals(" "))
136 | dateTimeUtils.cancelScheduledNotification(dateTimeUtils.getNotification(content, getContext()),
137 | getContext(), (int) oldRowId);
138 |
139 | updateFirebase = new UpdateFirebase();
140 | updateFirebase.deleteItem(toDoItem);
141 |
142 | Activity a = getActivity();
143 | if (a != null) {
144 | // This intent is for the dual pane mode, to refresh the UI
145 | a.startActivity(new Intent(getContext(), MainActivity.class));
146 | a.overridePendingTransition(0, 0);
147 | } else {
148 | getActivity().getSupportFragmentManager().isDestroyed();
149 | }
150 |
151 | }
152 | })
153 | .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
154 | @Override
155 | public void onClick(DialogInterface dialog, int which) {
156 | if (dialog != null) {
157 | dialog.dismiss();
158 | }
159 | }
160 | }).create();
161 | alertDialog.show();
162 | doKeepDialog(alertDialog);
163 | }
164 |
165 |
166 | /* Toast.makeText(getActivity(), getString(R.string.item_deleted), Toast.LENGTH_SHORT).show();
167 | ToDoItem toDoItem = new ToDoItem(content, done, reminder, hasReminder, mItemId);
168 |
169 | // remove existing scheduled notification if existed
170 | if (!reminder.equals(" "))
171 | dateTimeUtils.cancelScheduledNotification(dateTimeUtils.getNotification(content, getContext()),
172 | getContext(), (int) oldRowId);
173 |
174 | // Instantiate a new UpdateFirebase class
175 | updateFirebase = new UpdateFirebase();
176 | // **New** Delete the item from Firebase Database
177 | updateFirebase.deleteItem(toDoItem);
178 | getActivity().finish();
179 |
180 | // This intent is for the dual pane mode, to refresh the UI
181 | getActivity().startActivity(new Intent(v.getContext(), MainActivity.class));
182 | getActivity().overridePendingTransition(0, 0);*/
183 |
184 | });
185 |
186 | editTodo.setOnClickListener(new View.OnClickListener() {
187 | @Override
188 | public void onClick(View v) {
189 | Intent intent = new Intent(getContext(), AddTodoItem.class);
190 | intent.putExtra("item", currentToDoItem);
191 | intent.putExtra("content", content);
192 | intent.putExtra("reminder", reminder);
193 | intent.putExtra("hasReminder", hasReminder);
194 | intent.putExtra("done", done);
195 | intent.putExtra("id", mItemId);
196 | getActivity().finish();
197 | startActivity(intent);
198 | }
199 | });
200 | }
201 | }
202 |
203 | // Save the current state
204 | @Override
205 | public void onSaveInstanceState(Bundle currentState) {
206 | currentState.putString("currentContent", content);
207 | currentState.putString("currentReminder", reminder);
208 | currentState.putBoolean("currenthasReminder", hasReminder);
209 | currentState.putBoolean("currentDone", done);
210 | currentState.putString("currentItemId", mItemId);
211 |
212 | }
213 | }
214 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/PageFragment.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask;
2 |
3 | import android.content.Intent;
4 | import android.graphics.Paint;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v4.app.Fragment;
8 | import android.support.v4.app.FragmentManager;
9 | import android.support.v4.app.FragmentTransaction;
10 | import android.support.v7.widget.LinearLayoutManager;
11 | import android.support.v7.widget.RecyclerView;
12 | import android.view.LayoutInflater;
13 | import android.view.View;
14 | import android.view.ViewGroup;
15 | import android.view.animation.Animation;
16 | import android.view.animation.LinearInterpolator;
17 | import android.view.animation.TranslateAnimation;
18 | import android.widget.CompoundButton;
19 | import android.widget.Toast;
20 |
21 | import com.firebase.ui.database.FirebaseRecyclerAdapter;
22 | import com.firebase.ui.database.FirebaseRecyclerOptions;
23 | import com.google.firebase.auth.FirebaseAuth;
24 | import com.google.firebase.auth.FirebaseUser;
25 | import com.google.firebase.database.DatabaseReference;
26 | import com.google.firebase.database.FirebaseDatabase;
27 | import com.google.firebase.database.Query;
28 |
29 | import java.text.SimpleDateFormat;
30 | import java.util.Calendar;
31 | import java.util.HashMap;
32 |
33 | import redlor.it.minitask.Utils.SimpleDividerItemDecoration;
34 | import redlor.it.minitask.viewholder.FirebaseViewHolder;
35 |
36 | import static redlor.it.minitask.MainActivity.mTwoPane;
37 |
38 |
39 | public class PageFragment extends Fragment {
40 |
41 | DatabaseReference mDatabaseReference;
42 | FirebaseRecyclerAdapter mFirebaseAdapter;
43 | private RecyclerView mRecyclerView;
44 | private View view;
45 | private Toast mToast;
46 |
47 |
48 | @Override
49 | public void onCreate(@Nullable Bundle savedInstanceState) {
50 | super.onCreate(savedInstanceState);
51 |
52 | }
53 |
54 | @Nullable
55 | @Override
56 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
57 | // inflate the tab view with these fragments
58 | view = inflater.inflate(R.layout.fragment_page, container, false);
59 | return view;
60 | }
61 |
62 | @Override
63 | public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
64 | super.onViewCreated(view, savedInstanceState);
65 |
66 | FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
67 | String uid = firebaseUser.getUid();
68 |
69 | mDatabaseReference = FirebaseDatabase.getInstance().getReference("users").child(uid).child("toDoItems");
70 | mDatabaseReference.keepSynced(true);
71 |
72 | final Query query = FirebaseDatabase.getInstance()
73 | .getReference("users")
74 | .child(uid)
75 | .child("toDoItems")
76 | .limitToLast(50);
77 |
78 | FirebaseRecyclerOptions options =
79 | new FirebaseRecyclerOptions.Builder()
80 | .setQuery(query, ToDoItem.class)
81 | .build();
82 |
83 | mFirebaseAdapter = new FirebaseRecyclerAdapter(options
84 | ) {
85 |
86 | @Override
87 | public FirebaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
88 | View view = LayoutInflater.from(parent.getContext())
89 | .inflate(R.layout.todo_item, parent, false);
90 | return new FirebaseViewHolder(view);
91 | }
92 |
93 | @Override
94 | protected void onBindViewHolder(final FirebaseViewHolder viewHolder, final int position, final ToDoItem toDoItem) {
95 | // set the content of the item
96 | viewHolder.content.setText(toDoItem.getContent());
97 | // set the checkbox status of the item
98 | viewHolder.checkDone.setChecked(toDoItem.getDone());
99 | // check if checkbox is checked, then strike through the text
100 | // this is for the first time UI render
101 | if (viewHolder.checkDone.isChecked()) {
102 | viewHolder.content.setPaintFlags(viewHolder.content.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
103 | } else {
104 | viewHolder.content.setPaintFlags(viewHolder.content.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
105 | }
106 | // render the clock icon if the item has a reminder
107 | // and add a animation for expired item
108 | if (toDoItem.getHasReminder()) {
109 | viewHolder.clockReminder.setVisibility(View.VISIBLE);
110 | Calendar c = Calendar.getInstance();
111 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
112 | String currentDateTime = sdf.format(c.getTime());
113 | if (currentDateTime.compareTo(toDoItem.getReminderDate()) > 0) {
114 | TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 6);
115 | animation.setDuration(400);
116 | animation.setInterpolator(new LinearInterpolator());
117 | animation.setRepeatCount(Animation.INFINITE);
118 | viewHolder.clockReminder.setAnimation(animation);
119 | }
120 | } else {
121 | viewHolder.clockReminder.setVisibility(View.INVISIBLE);
122 | }
123 |
124 | viewHolder.checkDone.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
125 | @Override
126 | public void onCheckedChanged(CompoundButton compoundButton, final boolean b) {
127 | final String id = mFirebaseAdapter.getRef(position).getKey();
128 |
129 | if (b) {
130 | toDoItem.setDone(true);
131 | HashMap map = new HashMap<>();
132 | map.put("done", true);
133 | mDatabaseReference.child(id).updateChildren(map);
134 | viewHolder.checkDone.setOnCheckedChangeListener(null);
135 |
136 | } else {
137 | toDoItem.setDone(false);
138 | HashMap map = new HashMap<>();
139 | map.put("done", false);
140 | mDatabaseReference.child(id).updateChildren(map);
141 | viewHolder.checkDone.setOnCheckedChangeListener(null);
142 |
143 | }
144 | }
145 | });
146 |
147 | viewHolder.setOnClickListener(new FirebaseViewHolder.ClickListener() {
148 | @Override
149 | public void onItemClick(View view, int position) {
150 | final String itemId = mFirebaseAdapter.getRef(position).getKey();
151 | if (mTwoPane) {
152 | DetailFragment newDetailFragment = new DetailFragment();
153 | FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
154 | Bundle bundle = new Bundle();
155 | bundle.putString("content", toDoItem.getContent());
156 | bundle.putString("reminder", toDoItem.getReminderDate());
157 | bundle.putBoolean("hasReminder", toDoItem.getHasReminder());
158 | bundle.putBoolean("done", toDoItem.getDone());
159 | bundle.putString("itemId", itemId);
160 | newDetailFragment.setArguments(bundle);
161 |
162 | fragmentManager.beginTransaction()
163 | .replace(R.id.details_container, newDetailFragment)
164 | .detach(newDetailFragment)
165 | .attach(newDetailFragment)
166 | .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
167 | .commit();
168 | } else {
169 | Intent intent = new Intent(getContext(), DetailActivity.class);
170 | intent.putExtra("content", toDoItem.getContent());
171 | intent.putExtra("reminder", toDoItem.getReminderDate());
172 | intent.putExtra("hasReminder", toDoItem.getHasReminder());
173 | intent.putExtra("done", toDoItem.getDone());
174 | intent.putExtra("itemId", itemId);
175 | System.out.println("id in page fragment: " + itemId);
176 | startActivity(intent);
177 | }
178 | }
179 |
180 | @Override
181 | public void onItemLongClick(View view, int position) {
182 | if (mToast != null) {
183 | mToast.cancel();
184 | }
185 | boolean hasReminder = toDoItem.getHasReminder();
186 | if (hasReminder) {
187 | String reminder = toDoItem.getReminderDate();
188 | mToast = Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.reminder_info) + " " + reminder, Toast.LENGTH_SHORT);
189 | mToast.show();
190 | } else {
191 | mToast = Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.no_reminder), Toast.LENGTH_SHORT);
192 | mToast.show();
193 | }
194 | }
195 | });
196 | }
197 | };
198 |
199 | mRecyclerView = (RecyclerView) view.findViewById(R.id.to_do_list);
200 | mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
201 | mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getContext()));
202 | mRecyclerView.setAdapter(mFirebaseAdapter);
203 |
204 | }
205 |
206 | @Override
207 | public void onStop() {
208 | super.onStop();
209 | mFirebaseAdapter.stopListening();
210 |
211 | }
212 |
213 | @Override
214 | public void onStart() {
215 | super.onStart();
216 | mFirebaseAdapter.startListening();
217 | }
218 |
219 | @Override
220 | public void onResume() {
221 | super.onResume();
222 | }
223 |
224 | }
225 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/PrivacyActivity.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 |
6 | public class PrivacyActivity extends AppCompatActivity {
7 |
8 | @Override
9 | protected void onCreate(Bundle savedInstanceState) {
10 | setTheme(R.style.AppTheme);
11 | super.onCreate(savedInstanceState);
12 | setContentView(R.layout.activity_privacy);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/ToDoItem.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask;
2 |
3 | import com.google.firebase.database.Exclude;
4 |
5 | import java.io.Serializable;
6 | import java.util.HashMap;
7 | import java.util.Map;
8 |
9 | /**
10 | * Created by luongvo on 19/07/2017.
11 | */
12 |
13 | public class ToDoItem implements Serializable {
14 | public Map toDoItemsMap = new HashMap<>();
15 | private String content;
16 | private boolean done;
17 | private String reminderDate;
18 | private boolean hasReminder;
19 | private String mItemId;
20 |
21 | // Old constructor
22 | public ToDoItem(String content, boolean done, boolean hasReminder, String reminderDate) {
23 | this.content = content;
24 | this.done = done;
25 | this.hasReminder = hasReminder;
26 | this.reminderDate = reminderDate;
27 |
28 | }
29 |
30 | public ToDoItem() {
31 | }
32 |
33 | // New constructor with Firebase Id variable
34 | public ToDoItem(String content, boolean done, String reminderDate, boolean hasReminder, String itemId) {
35 | this.content = content;
36 | this.done = done;
37 | this.reminderDate = reminderDate;
38 | this.hasReminder = hasReminder;
39 | this.mItemId = itemId;
40 | }
41 |
42 |
43 | public boolean getHasReminder() {
44 | return hasReminder;
45 | }
46 |
47 | public String getContent() {
48 | return content;
49 | }
50 |
51 | public void setContent(String content) {
52 | this.content = content;
53 | }
54 |
55 | public boolean getDone() {
56 | return done;
57 | }
58 |
59 | public void setDone(Boolean done) {
60 | this.done = done;
61 | }
62 |
63 | public String getReminderDate() {
64 | return reminderDate;
65 | }
66 |
67 | public String getItemId() {
68 | return mItemId;
69 | }
70 |
71 | public void setItemId(String mItemId) {
72 | this.mItemId = mItemId;
73 | }
74 |
75 | // compare object for remove from array list
76 | @Override
77 | public boolean equals(Object obj) {
78 | if (this == obj)
79 | return true;
80 | if (obj == null)
81 | return false;
82 | if (getClass() != obj.getClass())
83 | return false;
84 | ToDoItem other = (ToDoItem) obj;
85 | if (!content.equals(other.content))
86 | return false;
87 | if (!reminderDate.equals(other.reminderDate))
88 | return false;
89 | if (hasReminder != other.hasReminder)
90 | return false;
91 | if (done != other.done)
92 | return false;
93 | return true;
94 | }
95 |
96 | @Override
97 | public String toString() {
98 | return "ToDoItem{" +
99 | "content='" + content + '\'' +
100 | ", done=" + done +
101 | ", reminderDate='" + reminderDate + '\'' +
102 | ", hasReminder=" + hasReminder +
103 | ", mItemId='" + mItemId + '\'' +
104 | '}';
105 | }
106 |
107 | @Exclude
108 | public Map toMap() {
109 | HashMap result = new HashMap<>();
110 | result.put("content", content);
111 | result.put("done", done);
112 | result.put("hasReminder", hasReminder);
113 | result.put("reminderDate", reminderDate);
114 |
115 | return result;
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/TodayFragment.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask;
2 |
3 | import android.content.Intent;
4 | import android.graphics.Paint;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v4.app.Fragment;
8 | import android.support.v4.app.FragmentManager;
9 | import android.support.v4.app.FragmentTransaction;
10 | import android.support.v7.widget.LinearLayoutManager;
11 | import android.support.v7.widget.RecyclerView;
12 | import android.view.LayoutInflater;
13 | import android.view.View;
14 | import android.view.ViewGroup;
15 | import android.widget.CompoundButton;
16 | import android.widget.Toast;
17 |
18 | import com.firebase.ui.database.FirebaseRecyclerAdapter;
19 | import com.firebase.ui.database.FirebaseRecyclerOptions;
20 | import com.google.firebase.auth.FirebaseAuth;
21 | import com.google.firebase.auth.FirebaseUser;
22 | import com.google.firebase.database.DatabaseReference;
23 | import com.google.firebase.database.FirebaseDatabase;
24 | import com.google.firebase.database.Query;
25 |
26 | import java.text.SimpleDateFormat;
27 | import java.util.Calendar;
28 | import java.util.Date;
29 | import java.util.HashMap;
30 |
31 | import redlor.it.minitask.Utils.SimpleDividerItemDecoration;
32 | import redlor.it.minitask.viewholder.FirebaseViewHolder;
33 |
34 | import static redlor.it.minitask.MainActivity.mTwoPane;
35 |
36 |
37 | public class TodayFragment extends Fragment {
38 |
39 |
40 | DatabaseReference mDatabaseReference;
41 | FirebaseRecyclerAdapter mFirebaseAdapter;
42 | Date today;
43 | String day;
44 | String myDay;
45 | private RecyclerView mRecyclerView;
46 | private View view;
47 | private Toast mToast;
48 |
49 | @Override
50 | public void onCreate(@Nullable Bundle savedInstanceState) {
51 | super.onCreate(savedInstanceState);
52 | setRetainInstance(true);
53 | }
54 |
55 |
56 | @Nullable
57 | @Override
58 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
59 | // inflate the tab view with these fragments
60 | view = inflater.inflate(R.layout.fragment_today, container, false);
61 | return view;
62 |
63 | }
64 |
65 | @Override
66 | public void setUserVisibleHint(boolean isVisibleToUser) {
67 | super.setUserVisibleHint(isVisibleToUser);
68 | if (isVisibleToUser) {
69 |
70 | firebaseLoadToday();
71 |
72 | }
73 | }
74 |
75 | @Override
76 | public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
77 | super.onViewCreated(view, savedInstanceState);
78 | }
79 |
80 |
81 | @Override
82 | public void onStop() {
83 | super.onStop();
84 | try {
85 | mFirebaseAdapter.stopListening();
86 | } catch (Exception e) {
87 | e.getStackTrace();
88 | }
89 |
90 | }
91 |
92 | @Override
93 | public void onStart() {
94 | super.onStart();
95 |
96 |
97 | }
98 |
99 | @Override
100 | public void onResume() {
101 | super.onResume();
102 | }
103 |
104 | private void firebaseLoadToday() {
105 | FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
106 | final String uid = firebaseUser.getUid();
107 |
108 | mDatabaseReference = FirebaseDatabase.getInstance().getReference("users").child(uid).child("toDoItems");
109 | mDatabaseReference.keepSynced(true);
110 |
111 | final Query query = FirebaseDatabase.getInstance()
112 | .getReference("users")
113 | .child(uid)
114 | .child("toDoItems")
115 | .limitToLast(50);
116 |
117 | final FirebaseRecyclerOptions options =
118 | new FirebaseRecyclerOptions.Builder()
119 | .setQuery(query, ToDoItem.class)
120 | .build();
121 | mFirebaseAdapter = new FirebaseRecyclerAdapter(options
122 | ) {
123 | @Override
124 | public FirebaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
125 | View view = LayoutInflater.from(parent.getContext())
126 | .inflate(R.layout.todo_item, parent, false);
127 | return new FirebaseViewHolder(view);
128 | }
129 |
130 |
131 | @Override
132 | protected void onBindViewHolder(final FirebaseViewHolder viewHolder, final int position, final ToDoItem toDoItem) {
133 | boolean hasReminder = toDoItem.getHasReminder();
134 | Calendar calendar = Calendar.getInstance();
135 | today = calendar.getTime();
136 | SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
137 | myDay = myFormat.format(today);
138 | String completeTime = toDoItem.getReminderDate();
139 | if (completeTime != null && !completeTime.equals(" ")) {
140 | String[] parts = completeTime.split(" ");
141 | day = parts[0];
142 | }
143 |
144 | if (hasReminder && myDay.equals(day)) {
145 | boolean todayB = true;
146 | System.out.println(myDay + " " + day);
147 | // set the content of the item
148 | viewHolder.content.setText(toDoItem.getContent());
149 | // set the checkbox status of the item
150 | viewHolder.checkDone.setChecked(toDoItem.getDone());
151 | // check if checkbox is checked, then strike through the text
152 | // this is for the first time UI render
153 | if (viewHolder.checkDone.isChecked()) {
154 | viewHolder.content.setPaintFlags(viewHolder.content.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
155 | } else {
156 | viewHolder.content.setPaintFlags(viewHolder.content.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
157 |
158 | }
159 | // render the clock icon if the item has a reminder
160 | if (toDoItem.getHasReminder())
161 | viewHolder.clockReminder.setVisibility(View.VISIBLE);
162 | else
163 | viewHolder.clockReminder.setVisibility(View.INVISIBLE);
164 |
165 | viewHolder.checkDone.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
166 | @Override
167 | public void onCheckedChanged(CompoundButton compoundButton, final boolean b) {
168 | final String id = mFirebaseAdapter.getRef(position).getKey();
169 |
170 | if (b) {
171 | toDoItem.setDone(true);
172 | HashMap map = new HashMap<>();
173 | map.put("done", true);
174 | mDatabaseReference.child(id).updateChildren(map);
175 | viewHolder.checkDone.setOnCheckedChangeListener(null);
176 |
177 | } else {
178 | toDoItem.setDone(false);
179 | HashMap map = new HashMap<>();
180 | map.put("done", false);
181 | mDatabaseReference.child(id).updateChildren(map);
182 | viewHolder.checkDone.setOnCheckedChangeListener(null);
183 |
184 | }
185 | }
186 | });
187 |
188 | viewHolder.setOnClickListener(new FirebaseViewHolder.ClickListener() {
189 | @Override
190 | public void onItemClick(View view, int position) {
191 | final String itemId = mFirebaseAdapter.getRef(position).getKey();
192 | if (mTwoPane) {
193 | DetailFragment newDetailFragment = new DetailFragment();
194 | FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
195 | Bundle bundle = new Bundle();
196 | bundle.putString("content", toDoItem.getContent());
197 | bundle.putString("reminder", toDoItem.getReminderDate());
198 | bundle.putBoolean("hasReminder", toDoItem.getHasReminder());
199 | bundle.putBoolean("done", toDoItem.getDone());
200 | bundle.putString("itemId", itemId);
201 | newDetailFragment.setArguments(bundle);
202 |
203 | fragmentManager.beginTransaction()
204 | .replace(R.id.details_container, newDetailFragment)
205 | .detach(newDetailFragment)
206 | .attach(newDetailFragment)
207 | .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
208 | .commit();
209 | } else {
210 | Intent intent = new Intent(getContext(), DetailActivity.class);
211 | intent.putExtra("content", toDoItem.getContent());
212 | intent.putExtra("reminder", toDoItem.getReminderDate());
213 | intent.putExtra("hasReminder", toDoItem.getHasReminder());
214 | intent.putExtra("done", toDoItem.getDone());
215 | intent.putExtra("itemId", itemId);
216 | startActivity(intent);
217 | }
218 | }
219 |
220 | @Override
221 | public void onItemLongClick(View view, int position) {
222 | if (mToast != null) {
223 | mToast.cancel();
224 | }
225 | String reminder = toDoItem.getReminderDate();
226 | mToast = Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.reminder_info) + " " + reminder, Toast.LENGTH_LONG);
227 | mToast.show();
228 | }
229 | });
230 |
231 |
232 | } else {
233 | viewHolder.LayoutHide();
234 | }
235 |
236 | }
237 | };
238 |
239 | mRecyclerView = (RecyclerView) view.findViewById(R.id.to_do_list_today);
240 | mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
241 | mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getContext()));
242 | mRecyclerView.setAdapter(mFirebaseAdapter);
243 | mFirebaseAdapter.startListening();
244 | }
245 | }
246 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/Utils/MyDateTimeUtils.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask.Utils;
2 |
3 | import android.app.AlarmManager;
4 | import android.app.Notification;
5 | import android.app.PendingIntent;
6 | import android.content.Context;
7 | import android.content.Intent;
8 | import android.graphics.BitmapFactory;
9 | import android.support.v4.app.NotificationCompat;
10 |
11 | import java.text.ParseException;
12 | import java.text.SimpleDateFormat;
13 | import java.util.Calendar;
14 | import java.util.Date;
15 |
16 | import redlor.it.minitask.MainActivity;
17 | import redlor.it.minitask.R;
18 |
19 | import static redlor.it.minitask.Utils.NotificationPublisher.NOTIFICATION;
20 | import static redlor.it.minitask.Utils.NotificationPublisher.NOTIFICATION_ID;
21 |
22 |
23 | // This class includes every helper function that relates to time
24 | public class MyDateTimeUtils {
25 |
26 | // Three simpledateformat for each specific use
27 | private SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
28 | private SimpleDateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss");
29 | private SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
30 |
31 | /* This return a formatted date if the parameter passed in is empty.
32 | It is used in case the user select the "set time" option without first "set date".
33 | The default date is today.
34 | We can have a equivalent fillTimeIfEmpty but I decided not to implement that
35 | Because time range is wider so it's hard to choose 1 point of time as default.*/
36 | public String fillDateIfEmpty(String date) {
37 | if (date.equals("")) {
38 | Calendar calendar = Calendar.getInstance();
39 | return dateFormatter.format(calendar.getTime());
40 | } else return date;
41 | }
42 |
43 | /*This returns a date string with passed-in integer year, months, dayofmonth.*/
44 | public String dateToString(int year, int monthOfYear, int dayOfMonth) {
45 | Calendar calendar = Calendar.getInstance();
46 | calendar.set(year, monthOfYear, dayOfMonth);
47 | return dateFormatter.format(calendar.getTime());
48 | }
49 |
50 | /*This returns a time string with passed-in integer year, months, dayofmonth.*/
51 | public String timeToString(int hourOfDay, int minute) {
52 | Calendar calendar = Calendar.getInstance();
53 | calendar.set(0, 0, 0, hourOfDay, minute);
54 | return timeFormatter.format(calendar.getTime());
55 | }
56 |
57 | /* this check if a date user chooses is not in the past by comparing to current date*/
58 | public boolean checkInvalidDate(int year, int monthOfYear, int dayOfMonth) {
59 | Calendar calendar = Calendar.getInstance();
60 | Date today = calendar.getTime();
61 | calendar.set(year, monthOfYear, dayOfMonth);
62 | Date dateSet = calendar.getTime();
63 | return (today.compareTo(dateSet) > 0);
64 | }
65 |
66 | /* This check if a time user chooses is not in the past by comparing to current time */
67 | public boolean checkInvalidTime(int hourOfDay, int minute) {
68 | Calendar calendar = Calendar.getInstance();
69 | int nowHour = calendar.get(Calendar.HOUR_OF_DAY);
70 | int nowMinute = calendar.get(Calendar.MINUTE);
71 | return (hourOfDay < nowHour || (hourOfDay == nowHour && minute <= nowMinute));
72 | }
73 |
74 | /* this schedule notification to the time that user set*/
75 | public void ScheduleNotification(Notification notification,
76 | Context context, int notificationID, String dateTime) {
77 | Intent notificationIntent = new Intent(context, NotificationPublisher.class);
78 | notificationIntent.putExtra(NOTIFICATION_ID, notificationID);
79 | notificationIntent.putExtra(NOTIFICATION, notification);
80 | PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
81 | // parse string parameter to milliseconds for later alarm set
82 | Date futureInMillis = null;
83 | try {
84 | futureInMillis = dateTimeFormatter.parse(dateTime);
85 | } catch (ParseException e) {
86 | e.printStackTrace();
87 | }
88 | AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
89 | alarmManager.set(AlarmManager.RTC_WAKEUP, futureInMillis.getTime(), pendingIntent);
90 | }
91 |
92 | /* this cancel a future notification if item is deleted or editted */
93 | public void cancelScheduledNotification(Notification notification,
94 | Context context, int notificationID) {
95 | Intent notificationIntent = new Intent(context, NotificationPublisher.class);
96 | notificationIntent.putExtra(NOTIFICATION_ID, notificationID);
97 | notificationIntent.putExtra(NOTIFICATION, notification);
98 | PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
99 | AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
100 | alarmManager.cancel(pendingIntent);
101 | }
102 |
103 | /* This is a helper function to build a notification object */
104 | public Notification getNotification(String content, Context context) {
105 | Intent intent = new Intent(context, MainActivity.class);
106 | PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
107 |
108 | NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
109 | builder.setContentTitle(context.getString(R.string.task_to_be_done));
110 | builder.setContentText(content);
111 | builder.setSmallIcon(R.drawable.ic_stat_name);
112 | builder.setDefaults(Notification.DEFAULT_ALL);
113 | builder.setPriority(Notification.PRIORITY_MAX);
114 | builder.setStyle(new NotificationCompat.BigTextStyle().bigText(content));
115 | builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),
116 | R.mipmap.ic_launcher));
117 | builder.setContentIntent(pendingIntent);
118 | builder.setShowWhen(false);
119 | builder.setAutoCancel(true);
120 | return builder.build();
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/Utils/NotificationPublisher.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask.Utils;
2 |
3 | /**
4 | * Created by luongvo on 26/07/2017.
5 | */
6 |
7 | import android.app.Notification;
8 | import android.app.NotificationManager;
9 | import android.content.BroadcastReceiver;
10 | import android.content.Context;
11 | import android.content.Intent;
12 |
13 | // This class manage notification publishing
14 | public class NotificationPublisher extends BroadcastReceiver {
15 |
16 | public static String NOTIFICATION_ID = "notification-id";
17 | public static String NOTIFICATION = "notification";
18 |
19 | public void onReceive(Context context, Intent intent) {
20 |
21 | NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
22 |
23 | Notification notification = intent.getParcelableExtra(NOTIFICATION);
24 | int id = intent.getIntExtra(NOTIFICATION_ID, 0);
25 | notificationManager.notify(id, notification);
26 |
27 |
28 | }
29 |
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/Utils/SimpleDividerItemDecoration.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask.Utils;
2 |
3 | import android.content.Context;
4 | import android.graphics.Canvas;
5 | import android.graphics.drawable.Drawable;
6 | import android.support.v4.content.ContextCompat;
7 | import android.support.v7.widget.RecyclerView;
8 | import android.view.View;
9 |
10 | import redlor.it.minitask.R;
11 |
12 |
13 | /**
14 | * Created by Redlor on 25/11/2017.
15 | * This class implements a divider for the items in the RecyclerView.
16 | */
17 |
18 | public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
19 | private Drawable mDivider;
20 |
21 | public SimpleDividerItemDecoration(Context context) {
22 | mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider);
23 | }
24 |
25 | @Override
26 | public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
27 | int left = parent.getPaddingLeft();
28 | int right = parent.getWidth() - parent.getPaddingRight();
29 |
30 | int childCount = parent.getChildCount();
31 | for (int i = 0; i < childCount; i++) {
32 | View child = parent.getChildAt(i);
33 |
34 | RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
35 |
36 | int top = child.getBottom() + params.bottomMargin;
37 | int bottom = top + mDivider.getIntrinsicHeight();
38 |
39 | mDivider.setBounds(left, top, right, bottom);
40 | mDivider.draw(c);
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/Utils/UpdateFirebase.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask.Utils;
2 |
3 | import android.content.Context;
4 |
5 | import com.google.firebase.auth.FirebaseAuth;
6 | import com.google.firebase.auth.FirebaseUser;
7 | import com.google.firebase.database.DataSnapshot;
8 | import com.google.firebase.database.DatabaseError;
9 | import com.google.firebase.database.DatabaseReference;
10 | import com.google.firebase.database.FirebaseDatabase;
11 | import com.google.firebase.database.Query;
12 | import com.google.firebase.database.ValueEventListener;
13 |
14 | import java.util.HashMap;
15 |
16 | import redlor.it.minitask.ToDoItem;
17 |
18 | /**
19 | * Created by Redlor on 25/11/2017.
20 | * This class contains the methods need to update the Real-Time Database on Firebase.
21 | */
22 |
23 | public class UpdateFirebase {
24 |
25 | MyDateTimeUtils dateTimeUtils;
26 | // Get a reference to the Database
27 | private FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
28 | private String uid = firebaseUser.getUid();
29 | private DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users").child(uid).child("toDoItems");
30 |
31 |
32 | public UpdateFirebase() {
33 | }
34 |
35 |
36 | // This method add a new item to Firebase Database
37 | public void addItem(ToDoItem toDoItem) {
38 | databaseReference.keepSynced(true);
39 | String itemId = databaseReference.push().getKey();
40 | System.out.println(itemId);
41 | databaseReference.child(itemId).setValue(toDoItem);
42 | toDoItem.setItemId(itemId);
43 | }
44 |
45 | public void updateItem(String newContent, boolean newHasReminder, String newReminderDate, String oldItemId) {
46 | databaseReference.keepSynced(true);
47 |
48 | HashMap map = new HashMap<>();
49 | map.put("content", newContent);
50 | map.put("hasReminder", newHasReminder);
51 | map.put("reminderDate", newReminderDate);
52 |
53 | databaseReference.child(oldItemId).updateChildren(map);
54 | }
55 |
56 | // This method delete an item from Firebase Database
57 | public void deleteItem(final ToDoItem toDoItem) {
58 | databaseReference.keepSynced(true);
59 |
60 | String id = toDoItem.getItemId();
61 | databaseReference.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
62 | @Override
63 | public void onDataChange(DataSnapshot dataSnapshot) {
64 | for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
65 | dataSnapshot1.getRef().removeValue();
66 | }
67 | }
68 |
69 | @Override
70 | public void onCancelled(DatabaseError databaseError) {
71 |
72 | }
73 | });
74 | }
75 |
76 | // This method delete all the checked items from Firebase
77 | public void deleteChecked(final Context context) {
78 | databaseReference.keepSynced(true);
79 | dateTimeUtils = new MyDateTimeUtils();
80 | Query query = databaseReference.orderByChild("done").equalTo(true);
81 | query.addListenerForSingleValueEvent(new ValueEventListener() {
82 | @Override
83 | public void onDataChange(DataSnapshot dataSnapshot) {
84 | for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
85 | ToDoItem toDoItem = dataSnapshot1.getValue(ToDoItem.class);
86 | String content = toDoItem.getContent();
87 | boolean reminder = toDoItem.getHasReminder();
88 | if (reminder) {
89 | dateTimeUtils.cancelScheduledNotification(dateTimeUtils.getNotification(content, context),
90 | context, (int) 0);
91 | }
92 |
93 | dataSnapshot1.getRef().removeValue();
94 |
95 | }
96 | }
97 |
98 | @Override
99 | public void onCancelled(DatabaseError databaseError) {
100 | }
101 | });
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/app/src/main/java/redlor/it/minitask/viewholder/FirebaseViewHolder.java:
--------------------------------------------------------------------------------
1 | package redlor.it.minitask.viewholder;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.View;
5 | import android.view.ViewGroup;
6 | import android.widget.CheckBox;
7 | import android.widget.ImageView;
8 | import android.widget.LinearLayout;
9 | import android.widget.TextView;
10 |
11 | import butterknife.BindView;
12 | import butterknife.ButterKnife;
13 | import redlor.it.minitask.R;
14 |
15 |
16 | /**
17 | * Created by Hp on 08/12/2017.
18 | */
19 |
20 | public class FirebaseViewHolder extends RecyclerView.ViewHolder {
21 |
22 | final LinearLayout.LayoutParams params;
23 | private final LinearLayout layout;
24 | @BindView(R.id.taskList)
25 | public LinearLayout taskList;
26 | @BindView(R.id.todoContent)
27 | public
28 | TextView content;
29 | @BindView(R.id.checkDone)
30 | public
31 | CheckBox checkDone;
32 | @BindView(R.id.clockReminder)
33 | public
34 | ImageView clockReminder;
35 | private FirebaseViewHolder.ClickListener mClickListener;
36 |
37 | public FirebaseViewHolder(final View view) {
38 | super(view);
39 | ButterKnife.bind(this, view);
40 | layout = (LinearLayout) itemView.findViewById(R.id.taskList);
41 | params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
42 | ViewGroup.LayoutParams.WRAP_CONTENT);
43 |
44 | itemView.setOnClickListener(new View.OnClickListener() {
45 | @Override
46 | public void onClick(View v) {
47 | mClickListener.onItemClick(v, getAdapterPosition());
48 | }
49 | });
50 | itemView.setOnLongClickListener(new View.OnLongClickListener() {
51 | @Override
52 | public boolean onLongClick(View view) {
53 | mClickListener.onItemLongClick(view, getAdapterPosition());
54 | return true;
55 | }
56 | });
57 | }
58 |
59 | public void setOnClickListener(FirebaseViewHolder.ClickListener clickListener) {
60 | mClickListener = clickListener;
61 |
62 |
63 | }
64 |
65 | public void LayoutHide() {
66 | params.height = 0;
67 | layout.setLayoutParams(params);
68 | }
69 |
70 | //Interface to send callbacks...
71 | public interface ClickListener {
72 | public void onItemClick(View view, int position);
73 |
74 | public void onItemLongClick(View view, int position);
75 | }
76 |
77 | }
78 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi-v11/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi-v11/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi-v9/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi-v9/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_access_alarms_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_access_alarms_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_alarm_on_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_alarm_on_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_alarm_on_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_alarm_on_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_delete_sweep_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_delete_sweep_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_done_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_done_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_email_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_email_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_plus_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_plus_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_warning_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-hdpi/ic_warning_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi-v11/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi-v11/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi-v9/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi-v9/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_access_alarms_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_access_alarms_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_alarm_on_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_alarm_on_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_alarm_on_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_alarm_on_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_delete_sweep_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_delete_sweep_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_done_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_done_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_email_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_email_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_plus_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_plus_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_warning_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-mdpi/ic_warning_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi-v11/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi-v11/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi-v9/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi-v9/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_access_alarms_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_access_alarms_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_alarm_on_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_alarm_on_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_alarm_on_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_alarm_on_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_delete_sweep_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_delete_sweep_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_done_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_done_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_email_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_email_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_plus_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_plus_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_warning_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xhdpi/ic_warning_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi-v11/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi-v11/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi-v9/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi-v9/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_access_alarms_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_access_alarms_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_alarm_on_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_alarm_on_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_alarm_on_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_alarm_on_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_delete_sweep_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_delete_sweep_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_done_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_done_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_email_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_email_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_plus_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_plus_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_stat_name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_stat_name.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_warning_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxhdpi/ic_warning_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_access_alarms_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_access_alarms_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_alarm_on_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_alarm_on_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_alarm_on_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_alarm_on_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_delete_sweep_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_delete_sweep_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_done_white_36dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_done_white_36dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_email_black_18dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_email_black_18dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_plus_white_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_plus_white_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_warning_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable-xxxhdpi/ic_warning_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_facebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/ic_facebook.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/ic_github.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_patreon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/ic_patreon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_paypal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/ic_paypal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/ic_twitter.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/inbox.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/inbox.webp
--------------------------------------------------------------------------------
/app/src/main/res/drawable/line_divider.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/seven_day.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/seven_day.webp
--------------------------------------------------------------------------------
/app/src/main/res/drawable/splash.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/splash.webp
--------------------------------------------------------------------------------
/app/src/main/res/drawable/splash_screen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/today.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/drawable/today.webp
--------------------------------------------------------------------------------
/app/src/main/res/layout-land/activity_add_todo_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
13 |
14 |
18 |
19 |
28 |
29 |
50 |
51 |
52 |
53 |
60 |
61 |
67 |
68 |
72 |
73 |
80 |
81 |
85 |
86 |
87 |
88 |
94 |
95 |
105 |
106 |
115 |
116 |
117 |
118 |
119 |
125 |
126 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
151 |
152 |
153 |
154 |
155 |
--------------------------------------------------------------------------------
/app/src/main/res/layout-sw600dp/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
14 |
15 |
20 |
21 |
26 |
27 |
36 |
37 |
42 |
43 |
44 |
45 |
55 |
56 |
57 |
58 |
59 |
63 |
64 |
72 |
73 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
23 |
24 |
33 |
34 |
40 |
41 |
49 |
50 |
57 |
58 |
66 |
67 |
76 |
77 |
78 |
83 |
84 |
91 |
92 |
102 |
103 |
104 |
109 |
110 |
117 |
118 |
128 |
129 |
130 |
131 |
140 |
141 |
146 |
147 |
154 |
155 |
165 |
166 |
167 |
172 |
173 |
180 |
181 |
191 |
192 |
193 |
198 |
199 |
206 |
207 |
217 |
218 |
219 |
220 |
221 |
222 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_add_todo_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
13 |
14 |
18 |
19 |
28 |
29 |
50 |
51 |
52 |
53 |
60 |
61 |
67 |
68 |
73 |
74 |
82 |
83 |
88 |
89 |
90 |
91 |
97 |
98 |
109 |
110 |
121 |
122 |
123 |
124 |
125 |
131 |
132 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
157 |
158 |
159 |
160 |
161 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_detail.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
20 |
21 |
30 |
31 |
36 |
37 |
38 |
39 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_privacy.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
23 |
24 |
33 |
34 |
35 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_detail.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
11 |
12 |
16 |
17 |
24 |
25 |
40 |
41 |
42 |
43 |
50 |
51 |
57 |
58 |
63 |
64 |
71 |
72 |
73 |
74 |
80 |
81 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
105 |
106 |
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_page.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_today.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_week.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/todo_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
17 |
18 |
28 |
29 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-ldpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/mipmap-ldpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-fr/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Minitask
4 |
5 | A propos
6 | En cours de nettoyage...
7 | Ajouter une tâche
8 | Insérer votre tâche ici
9 | Ne laissez pas votre tâche vide
10 | Configurer un rappel pour moi
11 | Régler la date
12 | Régler l\'heure
13 | Rappel réglé à
14 | Info à propos du rappel:
15 | Non trouvé!
16 | Tâche supprimée!
17 | Spécifier une heure
18 | Tâche à faire
19 | Détail
20 | Effacer les tâches effectuées
21 | Version 2.0
22 | Vous pouvez nous contacter sur
23 | Soutenez-nous sur
24 | Êtes-vous sûr de vouloir supprimer la tâche?
25 | Supprimer
26 | Annuler
27 | Voulez-vous vraiment supprimer toutes les tâches selectionnées?
28 | Il n\'y a pas de rappel pour cette activité!
29 | Préciser une heure est recommandé afin de recevoir une notification
30 | Auteur: Lorenzo Redaelli
31 | Idée et développement initial de:
32 | Tâches sélectionnées suppriméees
33 | Aucun item n\'a été coché
34 | Appuyez sur un item
35 | AUJOURD\'HUI
36 | SUR 7 JOURS
37 | Are you sure you want to delete this task?
38 | Lorenzo Redaelli built the Minitask app as an Open Source app. This SERVICE is provided by Lorenzo Redaelli at no cost and is intended for use as is. This page is used to inform website visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at [App Name]Minitask unless otherwise defined in this Privacy Policy. Information Collection and Use For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information, including but not limited to email, Google sign-in, tasks. The information that I request is retained on your device and is not collected by me in any way The app does use third party services that may collect information used to identify you. Link to privacy policy of third party service providers used by the app Google Play Services Firebase Analytics Log Data I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. Cookies Cookies are files with small amount of data that is commonly used an anonymous unique identifier. These are sent to your browser from the website that you visit and are stored on your device internal memory. This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collection information and to improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. Service Providers I may employ third-party companies and individuals due to the following reasons: To facilitate our Service; To provide the Service on our behalf; To perform Service-related services; or To assist us in analyzing how our Service is used. I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. Security I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. Links to Other Sites This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. Children’s Privacy These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions. Changes to This Privacy Policy I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page. Contact Us If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me. This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator
39 |
--------------------------------------------------------------------------------
/app/src/main/res/values-it/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Minitask
4 |
5 | Info
6 | Sto pulendo...
7 | Aggiungi un compito
8 | Inserisci il tuo compito qui
9 | Non lasciare il tuo compito vuoto!
10 | Aggiungi un promemoria
11 | Scegli la data
12 | Scegli l\'ora
13 | Promemoria impostato a:
14 | Info sul promemoria:
15 | Non trovato!
16 | compito cancellato!
17 | Per favore scegli l\'ora
18 | un orario specifico è migliore se vuoi avere un promemoria esatto
19 | Compiti da svolgere
20 | Dettagli
21 | Elimina i compiti fatti
22 | Versione 1.0
23 | Mi puoi contattare a:
24 | Supportami su:
25 | Sei sicuro di voler eliminare questo compito?
26 | Cancella
27 | Annulla
28 | Sei sicuro di voler eliminare tutti i compiti selezionati?
29 | Compiti selezionati eliminati
30 | Clicca su un compito
31 | OGGI
32 | 7 GIORNI
33 | Non c\'è un promemoria per questo compito
34 | Autore: Lorenzo Redaelli
35 | Da un\'idea e sviluppo iniziale di:
36 | Nessun compito è stato selezionato!
37 | Sei sicuro di voler eliminare questo task?
38 | Lorenzo Redaelli ha creato l\'app Minitask come app Open Source. Questo servizio è fornito da Lorenzo Redaelli gratuitamente e deve essere utilizzato così com\'è. Questa pagina viene utilizzata per informare i visitatori del sito web in merito alle mie politiche con la raccolta, l\'utilizzo e la divulgazione delle informazioni personali se qualcuno ha deciso di utilizzare il mio servizio. Se scegli di utilizzare il mio servizio, accetti la raccolta e l\'utilizzo delle informazioni in relazione a questa politica. Le informazioni personali che raccolgo vengono utilizzate per fornire e migliorare il servizio. Non userò o condividerò le tue informazioni con nessuno eccetto quanto descritto in questa Informativa sulla privacy. I termini utilizzati in questa Informativa sulla privacy hanno lo stesso significato dei nostri Termini e condizioni, che è accessibile al Minitask [Nome app], se non diversamente definito nella presente Informativa sulla privacy. Raccolta e utilizzo delle informazioni Per un\'esperienza migliore, durante l\'utilizzo del nostro servizio, potrei richiedere all\'utente di fornirci alcune informazioni di identificazione personale, incluse, a titolo esemplificativo, e-mail, accesso a Google, attività. Le informazioni che richiedo sono conservate sul tuo dispositivo e non sono raccolte da me in alcun modo L\'app utilizza servizi di terze parti che potrebbero raccogliere informazioni utilizzate per identificarti. Link alla privacy policy dei fornitori di servizi di terze parti utilizzati dall\'app Google Play Services Firebase Analytics Dati del registro Desidero informarti che ogni volta che si utilizza il mio servizio, in caso di errore nell\'app, raccolgo dati e informazioni (tramite terze parti prodotti) sul telefono chiamato Dati di registro. Questi dati di registro possono includere informazioni quali l\'indirizzo IP (\"IP\") del dispositivo, il nome del dispositivo, la versione del sistema operativo, la configurazione dell\'app quando si utilizza il mio servizio, l\'ora e la data di utilizzo del servizio e altre statistiche . Cookies I cookie sono file con una piccola quantità di dati che viene comunemente utilizzato come identificatore univoco anonimo. Questi vengono inviati al browser dal sito Web visitato e memorizzati nella memoria interna del dispositivo. Questo Servizio non utilizza questi \"cookie\" esplicitamente. Tuttavia, l\'app può utilizzare codici e librerie di terze parti che utilizzano \"cookie\" per raccogliere informazioni e migliorare i loro servizi. Hai la possibilità di accettare o rifiutare questi cookie e sapere quando un cookie viene inviato al tuo dispositivo. Se si sceglie di rifiutare i nostri cookie, potrebbe non essere possibile utilizzare alcune parti di questo servizio. Fornitori di servizi Potrei assumere società e persone terze per i seguenti motivi: per facilitare il nostro servizio; Per fornire il Servizio per nostro conto; Per eseguire servizi relativi ai servizi; o per aiutarci ad analizzare come viene utilizzato il nostro servizio. Voglio informare gli utenti di questo servizio che queste terze parti hanno accesso alle tue informazioni personali. Il motivo è eseguire i compiti assegnati a loro per nostro conto. Tuttavia, sono obbligati a non divulgare o utilizzare le informazioni per nessun altro scopo. Sicurezza Apprezzo la tua fiducia nel fornirci le tue informazioni personali, quindi ci stiamo adoperando per utilizzare mezzi commercialmente accettabili per proteggerli. Ma ricorda che nessun metodo di trasmissione su Internet o metodo di archiviazione elettronica è sicuro al 100% e affidabile e non posso garantire la sua assoluta sicurezza. Collegamenti ad altri siti Questo servizio può contenere collegamenti ad altri siti. Se fai clic su un link di terze parti, sarai indirizzato a quel sito. Si noti che questi siti esterni non sono gestiti da me. Pertanto, ti consiglio vivamente di rivedere l\'Informativa sulla privacy di questi siti web. Non ho alcun controllo e non mi assumo alcuna responsabilità per il contenuto, le politiche sulla privacy o le pratiche di qualsiasi sito o servizio di terze parti. Privacy dei bambini Questi servizi non sono rivolti a minori di 13 anni. Non raccolgo consapevolmente informazioni di identificazione personale da minori di 13 anni. Nel caso in cui scopro che un minore di 13 anni mi ha fornito informazioni personali, lo cancellerò immediatamente dal nostro server. Se sei un genitore o un tutore e sei consapevole del fatto che tuo figlio ci ha fornito informazioni personali, ti prego di contattarmi in modo da essere in grado di fare le azioni necessarie. Modifiche alla presente informativa sulla privacy Posso aggiornare la nostra politica sulla privacy di volta in volta. Pertanto, si consiglia di rivedere periodicamente questa pagina per eventuali modifiche. Ti informerò di eventuali modifiche pubblicando la nuova Informativa sulla privacy in questa pagina. Queste modifiche sono effettive immediatamente dopo essere state pubblicate su questa pagina. Contattaci Se avete domande o suggerimenti sulla mia politica sulla privacy, non esitate a contattarmi. Questa pagina informativa sulla privacy è stata creata su privacypolicytemplate.net e modificata / generata dal Generatore di norme sulla privacy dell\'app
39 |
--------------------------------------------------------------------------------
/app/src/main/res/values-pl/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Minitask
4 | O aplikacji
5 |
6 | There is not a reminder for this activity!
7 | Czyszczenie...
8 | Dodaj zadanie
9 | Twoje zadanie
10 | To pole nie może być puste
11 | Ustaw przypomnienie
12 | Ustaw datę
13 | Ustaw godzinę
14 | Ustaw przypomnienie na
15 | Ustawiono przypomnienie:
16 | Nic tu nie ma!
17 | Usunięto zadanie!
18 | Podaj godzinę
19 | Ustawienie godziny pomoże nam wysłać precyzyjne powiadomienie.
20 | Zadania do zrobienia
21 | Detale
22 | Usuń zrobione zadania
23 | Wersja 1.0
24 | Kontakt ze mną
25 | Wspieraj mnie
26 |
27 | Jesteś pewien, że chcesz usunąc to zadanie?
28 | Usuń
29 | Anuluj
30 | Na pewno chcesz usunąć wszystkie zaznaczone zadania?
31 | Usunięto zaznaczone zadania
32 |
33 | Zaznaczono element
34 | Are you sure you want to delete this task?
35 | Author: Lorenzo Redaelli
36 | From the idea and initial development of:
37 | No items have been checked!
38 | TODAY
39 | NEXT 7 DAYS
40 | Lorenzo Redaelli built the Minitask app as an Open Source app. This SERVICE is provided by Lorenzo Redaelli at no cost and is intended for use as is. This page is used to inform website visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at [App Name]Minitask unless otherwise defined in this Privacy Policy. Information Collection and Use For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information, including but not limited to email, Google sign-in, tasks. The information that I request is retained on your device and is not collected by me in any way The app does use third party services that may collect information used to identify you. Link to privacy policy of third party service providers used by the app Google Play Services Firebase Analytics Log Data I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. Cookies Cookies are files with small amount of data that is commonly used an anonymous unique identifier. These are sent to your browser from the website that you visit and are stored on your device internal memory. This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collection information and to improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. Service Providers I may employ third-party companies and individuals due to the following reasons: To facilitate our Service; To provide the Service on our behalf; To perform Service-related services; or To assist us in analyzing how our Service is used. I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. Security I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. Links to Other Sites This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. Children’s Privacy These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions. Changes to This Privacy Policy I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page. Contact Us If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me. This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator
41 |
--------------------------------------------------------------------------------
/app/src/main/res/values-pt/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Minitask
4 | Sobre
5 |
6 |
7 |
8 | Limpando...
9 | Adicionar Tarefa
10 | Insira sua tarefa aqui
11 | Não deixe a tarefa em branco
12 | Me lembre mais tarde
13 | Data
14 | Hora
15 | Lembrete para as
16 | Informacoes sobre o lembrete:
17 | Nao existe um lembrete para essa atividade!
18 | Nao encontrado!
19 | Tarefa deletada!
20 | Por favor, especifique um horario
21 | Um horario especifico seria melhor para notificacao apropriada
22 | Tafefas a serem completadas
23 | Detalhe
24 | Limpar tarefas completadas
25 | Versao 2.0
26 | Autor: Lorenzo Redaelli
27 | Da idea e do desenvolvimento inicial de:
28 | Voce pode entrar em contato em
29 | Nos suporte
30 |
31 |
32 | Tem certeza que deseja excluir essa tarefa?
33 | Excluir
34 | Cancelar
35 | Tem certeza que deseja excluir todas as tarefas selecionadas?
36 | Tarefas selecionadas deletadas
37 | Nenhum item checado!
38 |
39 | Clique em um item
40 |
41 | HOJE
42 | PROXIMO 7 DIAS
43 |
44 |
45 | Tem certeza que deseja deletar essa tarefa?
46 |
47 |
48 |
49 | Lorenzo Redaelli criou o aplicativo Minitask como um aplicativo Open Source. Este serviço é fornecido por Lorenzo Redaelli sem nenhum custo e destina-se a ser usado como está.
50 |
51 | Esta página é usada para informar os visitantes do site sobre minhas políticas com a coleta, uso e divulgação de Informações Pessoais se alguém decidiu usar meu Serviço.
52 |
53 | Se você optar por usar o meu Serviço, você concorda com a coleta e uso de informações em relação a esta política. As Informações Pessoais que eu coleciono são usadas para fornecer e melhorar o Serviço. Não usarei nem compartilharei sua informação com ninguém, exceto conforme descrito nesta Política de Privacidade.
54 |
55 | Os termos utilizados nesta Política de Privacidade têm os mesmos significados que nos nossos Termos e Condições, que está acessível no [Nome do Aplicativo] Minitask, a menos que seja definido de outra forma nesta Política de Privacidade.
56 |
57 | Coleta e uso de informações
58 |
59 | Para uma melhor experiência, ao usar nosso Serviço, talvez seja necessário que você nos forneça certas informações de identificação pessoal, incluindo, mas não limitado a, e-mail, login do Google, tarefas. A informação que solicito é mantida no seu dispositivo e não é recolhida por mim de forma alguma
60 |
61 | O aplicativo usa serviços de terceiros que podem coletar informações usadas para identificá-lo.
62 |
63 | Link para a política de privacidade dos provedores de serviços terceirizados usados pelo aplicativo
64 |
65 | Serviços do Google Play
66 |
67 | Análise da base de dados Firebase
68 |
69 | Dados de registro
70 |
71 | Quero informá-lo de que, sempre que usar o meu Serviço, em caso de erro no aplicativo, colete dados e informações (através de produtos de terceiros) em seu telefone chamado Log Data. Esses dados do registro podem incluir informações como o endereço do dispositivo IP (dispositivo IP), o nome do dispositivo, a versão do sistema operacional, a configuração do aplicativo quando utilizar o meu Serviço, a hora e a data do uso do serviço e outras estatísticas .
72 |
73 | Biscoitos
74 |
75 | Os cookies são arquivos com uma pequena quantidade de dados que é comumente usado como identificador exclusivo anônimo. Estes são enviados para o seu navegador a partir do site que você visita e são armazenados na memória interna do dispositivo.
76 |
77 | Este serviço não usa esses "cookies" explicitamente. No entanto, o aplicativo pode usar código de terceiros e bibliotecas que usam "cookies" para informações de coleta e para melhorar seus serviços. Você tem a opção de aceitar ou recusar esses cookies e saber quando um cookie está sendo enviado para o seu dispositivo. Se você optar por recusar nossos cookies, talvez você não consiga usar algumas partes desse Serviço.
78 |
79 | Provedores de serviço
80 |
81 | Posso empregar empresas terceirizadas e pessoas físicas devido às seguintes razões:
82 |
83 | Para facilitar o nosso Serviço;
84 |
85 | Para prestar o Serviço em nosso nome;
86 |
87 | Para executar serviços relacionados ao serviço; ou
88 |
89 | Para nos ajudar a analisar como nosso Serviço é usado.
90 |
91 | Quero informar os usuários deste Serviço que esses terceiros têm acesso às suas Informações Pessoais. A razão é executar as tarefas que lhes são atribuídas em nosso nome. No entanto, eles são obrigados a não divulgar ou usar a informação para qualquer outra finalidade.
92 |
93 | Segurança
94 |
95 | Eu valorizo sua confiança em nos fornecer suas Informações Pessoais, portanto estamos nos esforçando para usar meios comercialmente aceitáveis para protegê-la. Mas lembre-se de que nenhum método de transmissão pela internet, ou método de armazenamento eletrônico é 100% seguro e confiável, e não posso garantir sua segurança absoluta.
96 |
97 | Links para outros sites
98 |
99 | Este serviço pode conter links para outros sites. Se você clicar em um link de terceiros, você será direcionado para esse site. Observe que esses sites externos não são operados por mim. Portanto, eu recomendo vivamente que você analise a Política de Privacidade desses sites. Não tenho controle e não assumir nenhuma responsabilidade pelo conteúdo, políticas de privacidade ou práticas de sites ou serviços de terceiros.
100 |
101 | Privacidade infantil
102 |
103 | Estes Serviços não abordam pessoas com menos de 13 anos de idade. Não consigo recolher informações pessoalmente identificáveis de crianças menores de 13 anos. No caso, descubro que uma criança com menos de 13 anos me forneceu informações pessoais, eu imediatamente exclui isso dos nossos servidores. Se você é um pai ou tutor e está ciente de que seu filho nos forneceu informações pessoais, entre em contato comigo para que eu possa fazer as ações necessárias.
104 |
105 | Alterações nesta Política de Privacidade
106 |
107 | Posso atualizar a Política de Privacidade de tempos em tempos. Assim, você é aconselhável revisar esta página periodicamente para qualquer alteração. Vou avisá-lo de quaisquer alterações publicando a nova Política de Privacidade nesta página. Essas alterações são efetivas imediatamente após serem publicadas nesta página.
108 |
109 | Contate-Nos
110 |
111 | Se você tiver dúvidas ou sugestões sobre minha Política de Privacidade, não hesite em contactar-me.
112 |
113 | Esta página de política de privacidade foi criada em privacypolicytemplate.net e modificada / gerada pelo Gerente de Política de Privacidade da Aplicação
114 |
115 |
--------------------------------------------------------------------------------
/app/src/main/res/values-ru/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | О приложении
4 |
5 | Очистка…
6 | Добавить задачу
7 | Ваша задача
8 | Данное поле не может быть пустым
9 | Установить напоминание
10 | Установить дату
11 | Установить время
12 | Напоминание установлено на
13 | Информация о напоминании:
14 | Для этой активности нет напоминания!
15 | Не найдено!
16 | Задача удалена!
17 | Пожалуйста, укажите время
18 | Точное время лучше для надлежащего уведомления
19 | Задача для выполнения
20 | Подробности
21 | Очистить выполненные задачи
22 | Версия 2.0
23 | Автор: Lorenzo Redaelli
24 | Идея и первичная разработка:
25 | Luong Tran Thanh Vo
26 | Связаться с нами
27 | Поддержать нас
28 | thanh.luong.for.fun@gmail.com
29 | github.com/LewisVo
30 | twitter.com/MiracleLuong
31 | facebook.com/seeknd3stroy
32 | patreon.com/luongtranthanhvo
33 | paypal.me/LuongTranThanhVo
34 |
35 | github.com/redlor
36 | paypal.me/redlor
37 |
38 | Вы уверены, что хотите удалить задачу?
39 | Удалить
40 | Отмена
41 | Вы уверены, что хотите удалить все выбранные задачи?
42 | Выбранные задачи удалены
43 | Нет выбранных задач!
44 |
45 | Элемент выбран
46 |
47 | 298382557233568
48 | fb298382557233568
49 |
50 | Sign Out
51 |
52 | INBOX
53 | СЕГОДНЯ
54 | 7 ДНЕЙ
55 |
56 |
57 | Вы уверены, что хотите удалить эту задачу?
58 |
59 | Privacy Policy
60 |
61 | Lorenzo Redaelli built the Minitask app as an Open Source app. This SERVICE is provided by Lorenzo Redaelli at no cost and is intended for use as is. This page is used to inform website visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at [App Name]Minitask unless otherwise defined in this Privacy Policy.Information Collection and Use For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information, including but not limited to email, Google sign-in, tasks. The information that I request is retained on your device and is not collected by me in any way The app does use third party services that may collect information used to identify you. Link to privacy policy of third party service providers used by the app Google Play Services Firebase Analytics Log Data I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. Cookies Cookies are files with small amount of data that is commonly used an anonymous unique identifier. These are sent to your browser from the website that you visit and are stored on your device internal memory. This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collection information and to improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. Service Providers I may employ third-party companies and individuals due to the following reasons: To facilitate our Service; To provide the Service on our behalf; To perform Service-related services; or To assist us in analyzing how our Service is used. I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. Security I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. Links to Other Sites This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. Children’s Privacy These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions. Changes to This Privacy Policy I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page. Contact Us If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me. This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator
62 |
63 |
64 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
8 | #303f9f
9 |
10 |
11 | #3f51b5
12 | #efdcd5
13 | #c62828
14 | #ffffff
15 | #ffff00
16 | #757de8
17 | #303f9f
18 | #ffff00
19 |
20 |
21 | #757de8
22 | #3f51b5
23 | #303f9f
24 |
25 |
26 | #303f9f
27 |
28 |
29 | #1a237e
30 | #000051
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 100dp
6 | 20dp
7 | 10dp
8 | 30sp
9 | 20sp
10 | 14sp
11 | 8dp
12 | 18sp
13 | 5dp
14 | 27dp
15 |
16 |
17 | 32dp
18 | 10dp
19 | 20dp
20 | 16sp
21 | 10dp
22 | 18sp
23 | 25sp
24 | 24sp
25 | 16dp
26 | 20sp
27 | 12sp
28 |
29 |
30 | 160dp
31 | 4dp
32 | 15dp
33 |
34 |
35 | 20dp
36 | 10dp
37 | 30sp
38 | 12dp
39 | 20sp
40 |
41 |
42 | 14sp
43 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Minitask
3 | About
4 |
5 |
6 |
7 | Cleaning...
8 | Add task
9 | Insert your task here
10 | Don\'t leave your task empty
11 | Set a reminder for me
12 | Set Date
13 | Set Time
14 | Reminder set at
15 | Info about reminder:
16 | There is not a reminder for this activity!
17 | Not found!
18 | Task deleted!
19 | Please specify a time
20 | A specific time is better for proper notification
21 | Task to be done
22 | Detail
23 | Clean done tasks
24 | Version 2.0
25 | Author: Lorenzo Redaelli
26 | From the idea and initial development of:
27 | Luong Tran Thanh Vo
28 | You can contact us at
29 | Support us at
30 | thanh.luong.for.fun@gmail.com
31 | github.com/LewisVo
32 | twitter.com/MiracleLuong
33 | facebook.com/seeknd3stroy
34 | patreon.com/luongtranthanhvo
35 | paypal.me/LuongTranThanhVo
36 |
37 | github.com/redlor
38 | paypal.me/redlor
39 |
40 |
41 | Are you sure you want to delete the task?
42 | Delete
43 | Cancel
44 | Are you sure you want to delete all the selected tasks?
45 | Selected tasks deleted
46 | No items have been checked!
47 |
48 | Click an item
49 |
50 | 298382557233568
51 | fb298382557233568
52 |
53 | Sign Out
54 |
55 | INBOX
56 | TODAY
57 | NEXT 7 DAYS
58 |
59 |
60 | Are you sure you want to delete this task?
61 |
62 | Privacy Policy
63 | Lorenzo Redaelli built the Minitask app as an Open Source app. This SERVICE is provided by Lorenzo Redaelli at no cost and is intended for use as is. This page is used to inform website visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at [App Name]Minitask unless otherwise defined in this Privacy Policy. Information Collection and Use For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information, including but not limited to email, Google sign-in, tasks. The information that I request is retained on your device and is not collected by me in any way The app does use third party services that may collect information used to identify you. Link to privacy policy of third party service providers used by the app Google Play Services Firebase Analytics Log Data I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. Cookies Cookies are files with small amount of data that is commonly used an anonymous unique identifier. These are sent to your browser from the website that you visit and are stored on your device internal memory. This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collection information and to improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. Service Providers I may employ third-party companies and individuals due to the following reasons: To facilitate our Service; To provide the Service on our behalf; To perform Service-related services; or To assist us in analyzing how our Service is used. I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. Security I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. Links to Other Sites This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. Children’s Privacy These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions. Changes to This Privacy Policy I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page. Contact Us If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me. This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator
64 |
65 |
66 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/device.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/test/java/luongvo/com/todolistminimal/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package luongvo.com.todolistminimal;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.assertEquals;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | google()
7 | mavenCentral()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:3.0.1'
11 |
12 | // NOTE: Do not place your application dependencies here; they belong
13 | // in the individual module build.gradle files
14 | classpath 'com.google.gms:google-services:3.1.0'
15 | }
16 | }
17 |
18 | allprojects {
19 | repositories {
20 | jcenter()
21 | maven {
22 | url "https://maven.google.com"
23 | }
24 | google()
25 | }
26 | }
27 |
28 | task clean(type: Delete) {
29 | delete rootProject.buildDir
30 | }
31 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redlor/Minitask/4b505a130c05c5e26be1ae33067d2bc1505fdcf5/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Nov 22 21:02:46 CET 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------