From b91e173138f4cb415ad37273aed58e079eecc8f3 Mon Sep 17 00:00:00 2001 From: Oleg Doronin Date: Mon, 11 Apr 2016 04:46:09 +0300 Subject: [PATCH] Done without color --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 4 +- app/src/main/ic_launcher-web.png | Bin 0 -> 34940 bytes .../main/java/com/csc/lesson6/FeedsTable.java | 11 -- .../java/com/csc/lesson6/MainActivity.java | 58 ------- .../java/com/csc/tasklist/FeedsTable.java | 14 ++ .../java/com/csc/tasklist/MainActivity.java | 104 +++++++++++++ .../ReaderContentProvider.java | 33 +++- .../ReaderOpenHelper.java | 30 ++-- .../java/com/csc/tasklist/TaskAdapter.java | 142 ++++++++++++++++++ app/src/main/res/layout/item_task.xml | 26 ++++ app/src/main/res/layout/main.xml | 33 +++- app/src/main/res/layout/task_alert.xml | 26 ++++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 1858 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 1769 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 4605 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 6887 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10486 -> 10579 bytes app/src/main/res/values/strings.xml | 9 +- 19 files changed, 387 insertions(+), 104 deletions(-) create mode 100644 app/src/main/ic_launcher-web.png delete mode 100644 app/src/main/java/com/csc/lesson6/FeedsTable.java delete mode 100644 app/src/main/java/com/csc/lesson6/MainActivity.java create mode 100644 app/src/main/java/com/csc/tasklist/FeedsTable.java create mode 100644 app/src/main/java/com/csc/tasklist/MainActivity.java rename app/src/main/java/com/csc/{lesson6 => tasklist}/ReaderContentProvider.java (73%) rename app/src/main/java/com/csc/{lesson6 => tasklist}/ReaderOpenHelper.java (50%) create mode 100644 app/src/main/java/com/csc/tasklist/TaskAdapter.java create mode 100644 app/src/main/res/layout/item_task.xml create mode 100644 app/src/main/res/layout/task_alert.xml diff --git a/app/build.gradle b/app/build.gradle index 5c04260..46debdd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,4 +21,5 @@ android { dependencies { compile 'com.android.support:appcompat-v7:23.2.1' + compile 'me.priyesh:chroma:1.0.2' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7ab0b4b..d3d7c23 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.csc.tasklist"> @@ -20,7 +20,7 @@ diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ebf69d21cc29bfb3b9efd69abc2de9796c2257 GIT binary patch literal 34940 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"); - values.put(FeedsTable.COLUMN_DATE, - "Mon, 28 Mar 2016 19:04:05 +0300"); - getContentResolver().insert( - ENTRIES_URI, - values); - } -} diff --git a/app/src/main/java/com/csc/tasklist/FeedsTable.java b/app/src/main/java/com/csc/tasklist/FeedsTable.java new file mode 100644 index 0000000..d57d946 --- /dev/null +++ b/app/src/main/java/com/csc/tasklist/FeedsTable.java @@ -0,0 +1,14 @@ +package com.csc.tasklist; + +import android.provider.BaseColumns; + +interface FeedsTable extends BaseColumns { + String TABLE_NAME = "TTASKLIST"; + + String COLUMN_HEADER = "CHEADER"; + String COLUMN_BODY = "CBODY"; + String COLUMN_DATE = "CDATE"; + String COLUMN_DONE = "CDONE"; + String COLUMN_STAR = "CSTAR"; + String COLUMN_COLOR = "CCOLOR"; +} diff --git a/app/src/main/java/com/csc/tasklist/MainActivity.java b/app/src/main/java/com/csc/tasklist/MainActivity.java new file mode 100644 index 0000000..f0321d8 --- /dev/null +++ b/app/src/main/java/com/csc/tasklist/MainActivity.java @@ -0,0 +1,104 @@ +package com.csc.tasklist; + +import android.app.ActionBar; +import android.content.ContentValues; +import android.content.DialogInterface; +import android.database.ContentObserver; +import android.database.Cursor; +import android.graphics.Color; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.text.InputType; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; + +import java.util.Calendar; + +import me.priyesh.chroma.ChromaDialog; +import me.priyesh.chroma.ColorMode; +import me.priyesh.chroma.ColorSelectListener; + +public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks { + private Button btnAddTask; + Cursor cursor; + TaskAdapter taskAdapter; + public static final Uri ENTRIES_URI = Uri.withAppendedPath(ReaderContentProvider.CONTENT_URI, "entries"); + + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.main); + btnAddTask = (Button) findViewById(R.id.add_task); + btnAddTask.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); + builder.setTitle(getString(R.string.header_alert)); + final LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(R.layout.task_alert, null); + builder.setView(ll); + + + builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ContentValues values = new ContentValues(); + String header = ((EditText) ll.findViewById(R.id.alert_header)).getText().toString(); + String body = ((EditText) ll.findViewById(R.id.alert_body)).getText().toString(); + values.put(FeedsTable.COLUMN_HEADER, header); + values.put(FeedsTable.COLUMN_BODY, body); + values.put(FeedsTable.COLUMN_COLOR, Color.WHITE); + getContentResolver().insert(ENTRIES_URI, values); + } + }); + builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + builder.show(); + } + }); + + ListView listTasks = (ListView) findViewById(R.id.list_tasks); + taskAdapter = new TaskAdapter(this, null, this); + listTasks.setAdapter(taskAdapter); + getSupportLoaderManager().initLoader(0, null, this); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + + @Override + public Loader onCreateLoader(int id, Bundle args) { + return new CursorLoader(this, ENTRIES_URI, null, null, null, FeedsTable.COLUMN_DONE + ", " + FeedsTable.COLUMN_STAR + " DESC, " + FeedsTable.COLUMN_DATE + " DESC"); + } + + @Override + public void onLoadFinished(Loader loader, Cursor data) { + taskAdapter.swapCursor(data); + } + + @Override + public void onLoaderReset(Loader loader) { + taskAdapter.swapCursor(null); + } +} diff --git a/app/src/main/java/com/csc/lesson6/ReaderContentProvider.java b/app/src/main/java/com/csc/tasklist/ReaderContentProvider.java similarity index 73% rename from app/src/main/java/com/csc/lesson6/ReaderContentProvider.java rename to app/src/main/java/com/csc/tasklist/ReaderContentProvider.java index f8e6c21..c61bdc1 100644 --- a/app/src/main/java/com/csc/lesson6/ReaderContentProvider.java +++ b/app/src/main/java/com/csc/tasklist/ReaderContentProvider.java @@ -1,4 +1,4 @@ -package com.csc.lesson6; +package com.csc.tasklist; import android.content.ContentProvider; import android.content.ContentUris; @@ -11,7 +11,7 @@ import android.support.annotation.NonNull; public class ReaderContentProvider extends ContentProvider { - public static final String AUTHORITY = "com.csc.lesson6"; + public static final String AUTHORITY = "com.csc.tasklist"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); public static final int ENTRIES = 1; @@ -32,8 +32,18 @@ public ReaderContentProvider() { @Override public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) { - // Implement this to handle requests to delete one or more rows. - throw new UnsupportedOperationException("Not yet implemented"); + int match = uriMatcher.match(uri); + String tableName; + switch (match) { + case ENTRIES: + tableName = FeedsTable.TABLE_NAME; + break; + default: + throw new UnsupportedOperationException("Not yet implemented"); + } + int count = helper.getWritableDatabase().delete(tableName, selection, selectionArgs); + getContext().getContentResolver().notifyChange(uri, null); + return count; } @Override @@ -51,7 +61,6 @@ public Uri insert(@NonNull Uri uri, ContentValues values) { case ENTRIES: tableName = FeedsTable.TABLE_NAME; break; - case ENTRIES_ID: default: throw new UnsupportedOperationException("Not yet implemented"); } @@ -88,7 +97,17 @@ public Cursor query(@NonNull Uri uri, String[] projection, String selection, @Override public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) { - // TODO: Implement this to handle requests to update one or more rows. - throw new UnsupportedOperationException("Not yet implemented"); + int match = uriMatcher.match(uri); + String tableName; + switch (match) { + case ENTRIES: + tableName = FeedsTable.TABLE_NAME; + break; + default: + throw new UnsupportedOperationException("Not yet implemented"); + } + int count = helper.getWritableDatabase().update(tableName, values, selection, selectionArgs); + getContext().getContentResolver().notifyChange(uri, null); + return count; } } diff --git a/app/src/main/java/com/csc/lesson6/ReaderOpenHelper.java b/app/src/main/java/com/csc/tasklist/ReaderOpenHelper.java similarity index 50% rename from app/src/main/java/com/csc/lesson6/ReaderOpenHelper.java rename to app/src/main/java/com/csc/tasklist/ReaderOpenHelper.java index 368bb0a..31e987b 100644 --- a/app/src/main/java/com/csc/lesson6/ReaderOpenHelper.java +++ b/app/src/main/java/com/csc/tasklist/ReaderOpenHelper.java @@ -1,24 +1,25 @@ -package com.csc.lesson6; +package com.csc.tasklist; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class ReaderOpenHelper extends SQLiteOpenHelper { - public static final int DATABASE_VERSION = 2; - public static final String DATABASE_NAME = "reader.db"; + public static final int DATABASE_VERSION = 1; + public static final String DATABASE_NAME = "tasklist.db"; private static final String SQL_CREATE_ENTRIES_TABLE = "CREATE TABLE " + FeedsTable.TABLE_NAME + "(" + FeedsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + FeedsTable.COLUMN_TITLE + " TEXT, " - + FeedsTable.COLUMN_CONTENT + " TEXT, " - + FeedsTable.COLUMN_DATE + " TEXT" + + FeedsTable.COLUMN_HEADER + " TEXT, " + + FeedsTable.COLUMN_BODY + " TEXT, " + + FeedsTable.COLUMN_DATE + " DATETIME DEFAULT CURRENT_TIMESTAMP, " + + FeedsTable.COLUMN_DONE + " INTEGER DEFAULT 0, " //BOOLEAN + + FeedsTable.COLUMN_STAR + " INTEGER DEFAULT 0, " //BOOLEAN + + FeedsTable.COLUMN_COLOR + " INTEGER " //COLOR + ")"; - private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + FeedsTable.TABLE_NAME; - public ReaderOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @@ -28,17 +29,6 @@ public void onCreate(SQLiteDatabase db) { } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - db.execSQL(SQL_DELETE_ENTRIES); - switch (oldVersion) { - case 1: -// ... - break; - case 2: -// ... - break; - default: - throw new IllegalStateException(); - } - onCreate(db); + //skip now } } diff --git a/app/src/main/java/com/csc/tasklist/TaskAdapter.java b/app/src/main/java/com/csc/tasklist/TaskAdapter.java new file mode 100644 index 0000000..234fa2d --- /dev/null +++ b/app/src/main/java/com/csc/tasklist/TaskAdapter.java @@ -0,0 +1,142 @@ +package com.csc.tasklist; + +import android.app.ActionBar; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.database.Cursor; +import android.graphics.Color; +import android.graphics.Paint; +import android.support.v7.app.AlertDialog; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CursorAdapter; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +/** + * Created by Oleg Doronin + * TaskList + * Copyright (c) 2016 CS. All rights reserved. + */ +public class TaskAdapter extends CursorAdapter { + + private MainActivity activity; + private int paintFlags; + + TaskAdapter(Context context, Cursor cursor, MainActivity activity) { + super(context, cursor, 0); + this.activity = activity; + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return LayoutInflater.from(context).inflate(R.layout.item_task, parent, false); + } + + @Override + public void bindView(View view, final Context context, Cursor cursor) { + final LinearLayout llItemTask = (LinearLayout) view.findViewById(R.id.item_task); + final CheckBox cbDone = (CheckBox) view.findViewById(R.id.item_task_done); + final CheckBox cbStar = (CheckBox) view.findViewById(R.id.item_task_star); + final TextView tvHeader = (TextView) view.findViewById(R.id.item_task_header); + + final int id = cursor.getInt(cursor.getColumnIndex(FeedsTable._ID)); + final String header = cursor.getString(cursor.getColumnIndex(FeedsTable.COLUMN_HEADER)); + final String body = cursor.getString(cursor.getColumnIndex(FeedsTable.COLUMN_BODY)); + final int done = cursor.getInt(cursor.getColumnIndex(FeedsTable.COLUMN_DONE)); + final int star = cursor.getInt(cursor.getColumnIndex(FeedsTable.COLUMN_STAR)); + final int color = cursor.getInt(cursor.getColumnIndex(FeedsTable.COLUMN_COLOR)); + + llItemTask.setBackgroundColor(color); + cbDone.setChecked(done == 0 ? false : true); + cbDone.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + tvHeader.setPaintFlags(paintFlags | Paint.STRIKE_THRU_TEXT_FLAG); + } else { + tvHeader.setPaintFlags(paintFlags); + } + ContentValues values = new ContentValues(); + values.put(FeedsTable.COLUMN_DONE, isChecked); + activity.getContentResolver().update(activity.ENTRIES_URI, values, FeedsTable._ID + "=" + Integer.toString(id), null); + } + }); + cbStar.setChecked(star == 0 ? false : true); + cbStar.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + ContentValues values = new ContentValues(); + values.put(FeedsTable.COLUMN_STAR, isChecked); + activity.getContentResolver().update(activity.ENTRIES_URI, values, FeedsTable._ID + "=" + Integer.toString(id), null); + } + }); + + tvHeader.setText(header); + if (!cbDone.isChecked()) { + paintFlags = tvHeader.getPaintFlags(); + } + + if (cbDone.isChecked()) { + tvHeader.setPaintFlags(paintFlags | Paint.STRIKE_THRU_TEXT_FLAG); + } + + /*new ChromaDialog.Builder() + .initialColor(Color.GREEN) + .colorMode(ColorMode.RGB) // There's also ARGB and HSV + .onColorSelected(new ColorSelectListener() { + @Override + public void onColorSelected(int i) { + + } + }) + .create() + .show(getSupportFragmentManager(), "ChromaDialog");*/ // 3:00 left to sleep. I went to sleep. Sorry :( + + llItemTask.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(context.getString(R.string.header_alert)); + final LinearLayout ll = (LinearLayout) activity.getLayoutInflater().inflate(R.layout.task_alert, null); + builder.setView(ll); + ((EditText) ll.findViewById(R.id.alert_header)).setText(header); + ((EditText) ll.findViewById(R.id.alert_body)).setText(body); + + builder.setPositiveButton(context.getString(R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ContentValues values = new ContentValues(); + String header = ((EditText) ll.findViewById(R.id.alert_header)).getText().toString(); + String body = ((EditText) ll.findViewById(R.id.alert_body)).getText().toString(); + values.put(FeedsTable.COLUMN_HEADER, header); + values.put(FeedsTable.COLUMN_BODY, body); + values.put(FeedsTable.COLUMN_COLOR, Color.WHITE); + activity.getContentResolver().update(activity.ENTRIES_URI, values, FeedsTable._ID + "=" + Integer.toString(id), null); + } + }); + builder.setNegativeButton(context.getString(R.string.cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + builder.setNeutralButton(context.getString(R.string.remove), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + activity.getContentResolver().delete(activity.ENTRIES_URI, FeedsTable._ID + "=" + Integer.toString(id), null); + } + }); + + builder.show(); + } + }); + + } +} diff --git a/app/src/main/res/layout/item_task.xml b/app/src/main/res/layout/item_task.xml new file mode 100644 index 0000000..f291396 --- /dev/null +++ b/app/src/main/res/layout/item_task.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml index 2970a1c..fa9a24e 100644 --- a/app/src/main/res/layout/main.xml +++ b/app/src/main/res/layout/main.xml @@ -4,11 +4,34 @@ android:layout_height="match_parent" android:orientation="vertical"> -