From 283ffc7d67f2ec15b7ebe89a1d76bb45bade15c5 Mon Sep 17 00:00:00 2001 From: chetan Date: Mon, 11 May 2020 18:22:56 +0530 Subject: [PATCH] changes --- app/build.gradle | 25 ++- app/src/main/AndroidManifest.xml | 9 +- .../todoapp/{AppDatabase.kt => AppDatabse.kt} | 0 .../com/example/todoapp/HistoryActivity.kt | 94 ++++++++++ .../java/com/example/todoapp/MainActivity.kt | 11 +- .../java/com/example/todoapp/TaskActivity.kt | 53 ++++-- .../java/com/example/todoapp/TaskReceiver.kt | 32 ++++ .../main/java/com/example/todoapp/TodoDao.kt | 7 + .../drawable-v24/ic_launcher_foreground.xml | 18 +- app/src/main/res/layout/activity_history.xml | 35 +++- app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/layout/activity_task.xml | 81 ++++----- app/src/main/res/layout/alert.xml | 29 +++ app/src/main/res/menu/history.xml | 13 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew.bat | 168 +++++++++--------- settings.gradle | 2 +- 22 files changed, 424 insertions(+), 181 deletions(-) rename app/src/main/java/com/example/todoapp/{AppDatabase.kt => AppDatabse.kt} (100%) create mode 100644 app/src/main/java/com/example/todoapp/TaskReceiver.kt create mode 100644 app/src/main/res/layout/alert.xml create mode 100644 app/src/main/res/menu/history.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/app/build.gradle b/app/build.gradle index a67b989..5690a68 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,48 +1,47 @@ apply plugin: 'com.android.application' + apply plugin: 'kotlin-android' + apply plugin: 'kotlin-android-extensions' + apply plugin: 'kotlin-kapt' android { compileSdkVersion 29 buildToolsVersion "29.0.3" - defaultConfig { applicationId "com.example.todoapp" - minSdkVersion 23 + minSdkVersion 22 targetSdkVersion 29 versionCode 1 versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } - buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0" - implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'com.google.android.material:material:1.1.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' + def room_version = "2.2.5" + implementation "androidx.room:room-runtime:$room_version" + annotationProcessor "androidx.room:room-compiler:$room_version" + kapt "androidx.room:room-compiler:$room_version" + implementation "androidx.room:room-ktx:$room_version" - //database - implementation "androidx.room:room-runtime:2.2.3" - implementation "androidx.room:room-ktx:2.2.3" - kapt "androidx.room:room-compiler:2.2.3" + implementation 'com.google.android.material:material:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 131ed5a..b1e561d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,16 +1,17 @@ - - - + + + + diff --git a/app/src/main/java/com/example/todoapp/AppDatabase.kt b/app/src/main/java/com/example/todoapp/AppDatabse.kt similarity index 100% rename from app/src/main/java/com/example/todoapp/AppDatabase.kt rename to app/src/main/java/com/example/todoapp/AppDatabse.kt diff --git a/app/src/main/java/com/example/todoapp/HistoryActivity.kt b/app/src/main/java/com/example/todoapp/HistoryActivity.kt index 4c31fa5..13e7353 100644 --- a/app/src/main/java/com/example/todoapp/HistoryActivity.kt +++ b/app/src/main/java/com/example/todoapp/HistoryActivity.kt @@ -2,11 +2,105 @@ package com.example.todoapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.view.Menu +import android.view.MenuItem +import androidx.appcompat.widget.SearchView +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import kotlinx.android.synthetic.main.activity_history.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch class HistoryActivity : AppCompatActivity() { + val db by lazy { + AppDatabase.getDatabase(this) + } + + + val list = arrayListOf() + var com_adapter = TodoAdapter(list) + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_history) + setSupportActionBar(toolbar) + completedRv.apply { + layoutManager = LinearLayoutManager(this@HistoryActivity) + adapter = this@HistoryActivity.com_adapter + } + + + db.todoDao().getFinishedTask().observe(this, Observer { + if (!it.isNullOrEmpty()) { + list.clear() + list.addAll(it) + com_adapter.notifyDataSetChanged() + }else{ + list.clear() + com_adapter.notifyDataSetChanged() + } + }) + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.history, menu) + val item = menu.findItem(R.id.search) + val searchView = item.actionView as SearchView + item.setOnActionExpandListener(object :MenuItem.OnActionExpandListener{ + override fun onMenuItemActionExpand(item: MenuItem?): Boolean { + displayTodo() + return true + } + + override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { + displayTodo() + return true + } + + }) + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{ + override fun onQueryTextSubmit(query: String?): Boolean { + return false + } + + override fun onQueryTextChange(newText: String?): Boolean { + if(!newText.isNullOrEmpty()){ + displayTodo(newText) + } + return true + } + + }) + + return super.onCreateOptionsMenu(menu) + } + + fun displayTodo(newText: String = "") { + db.todoDao().getFinishedTask().observe(this, Observer { + if(it.isNotEmpty()){ + list.clear() + list.addAll( + it.filter { todo -> + todo.title.contains(newText,true) + } + ) + com_adapter.notifyDataSetChanged() + } + }) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.delete -> { + + GlobalScope.launch(Dispatchers.IO) { + db.todoDao().delete_finished_task() + } + + } + } + return super.onOptionsItemSelected(item) } } diff --git a/app/src/main/java/com/example/todoapp/MainActivity.kt b/app/src/main/java/com/example/todoapp/MainActivity.kt index 19ace7e..a9205b2 100644 --- a/app/src/main/java/com/example/todoapp/MainActivity.kt +++ b/app/src/main/java/com/example/todoapp/MainActivity.kt @@ -1,13 +1,21 @@ package com.example.todoapp +import android.app.AlarmManager +import android.app.Notification +import android.app.PendingIntent +import android.content.Context +import android.content.Context.ALARM_SERVICE import android.content.Intent import android.graphics.* import android.os.Bundle +import android.os.SystemClock import android.view.Menu import android.view.MenuItem import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat.getSystemService import androidx.lifecycle.Observer import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager @@ -21,7 +29,6 @@ class MainActivity : AppCompatActivity() { val list = arrayListOf() var adapter = TodoAdapter(list) - val db by lazy { AppDatabase.getDatabase(this) } @@ -49,6 +56,7 @@ class MainActivity : AppCompatActivity() { }) + } fun initSwipe() { @@ -209,4 +217,5 @@ class MainActivity : AppCompatActivity() { fun openNewTask(view: View) { startActivity(Intent(this, TaskActivity::class.java)) } + } diff --git a/app/src/main/java/com/example/todoapp/TaskActivity.kt b/app/src/main/java/com/example/todoapp/TaskActivity.kt index 1286958..766385e 100644 --- a/app/src/main/java/com/example/todoapp/TaskActivity.kt +++ b/app/src/main/java/com/example/todoapp/TaskActivity.kt @@ -1,15 +1,19 @@ package com.example.todoapp -import android.app.DatePickerDialog -import android.app.TimePickerDialog +import android.app.* +import android.content.Context +import android.content.DialogInterface +import android.content.Intent import android.os.Bundle import android.view.View import android.widget.ArrayAdapter import android.widget.DatePicker import android.widget.TimePicker import androidx.appcompat.app.AppCompatActivity -import androidx.room.Room +import androidx.core.content.ContextCompat.getSystemService +import androidx.core.content.getSystemService import kotlinx.android.synthetic.main.activity_task.* +import kotlinx.android.synthetic.main.alert.view.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -18,7 +22,6 @@ import java.text.SimpleDateFormat import java.util.* const val DB_NAME = "todo.db" - class TaskActivity : AppCompatActivity(), View.OnClickListener { lateinit var myCalendar: Calendar @@ -29,10 +32,8 @@ class TaskActivity : AppCompatActivity(), View.OnClickListener { var finalDate = 0L var finalTime = 0L - private val labels = arrayListOf("Personal", "Business", "Insurance", "Shopping", "Banking") - val db by lazy { AppDatabase.getDatabase(this) } @@ -46,18 +47,30 @@ class TaskActivity : AppCompatActivity(), View.OnClickListener { saveBtn.setOnClickListener(this) - setUpSpinner() - } - - private fun setUpSpinner() { val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, labels) labels.sort() spinnerCategory.adapter = adapter + imgAddCategory.setOnClickListener { + + val alertDialog = AlertDialog.Builder(this) + val custom_layout = layoutInflater.inflate(R.layout.alert,null) + alertDialog.setView(custom_layout) + alertDialog.setPositiveButton("Submit",DialogInterface.OnClickListener { dialog, which -> + + labels.add(custom_layout.spin.text.toString()) + labels.sort() + adapter.notifyDataSetChanged() + }) + val dial : AlertDialog = alertDialog.create(); + dial.setCanceledOnTouchOutside(true) + dial.show() + } } + override fun onClick(v: View) { when (v.id) { R.id.dateEdt -> { @@ -77,19 +90,22 @@ class TaskActivity : AppCompatActivity(), View.OnClickListener { val category = spinnerCategory.selectedItem.toString() val title = titleInpLay.editText?.text.toString() val description = taskInpLay.editText?.text.toString() + val model = TodoModel( + title, + description, + category, + finalDate, + finalTime + ) GlobalScope.launch(Dispatchers.Main) { val id = withContext(Dispatchers.IO) { return@withContext db.todoDao().insertTask( - TodoModel( - title, - description, - category, - finalDate, - finalTime - ) + model ) } + + finish() } @@ -148,8 +164,7 @@ class TaskActivity : AppCompatActivity(), View.OnClickListener { finalDate = myCalendar.time.time dateEdt.setText(sdf.format(myCalendar.time)) - timeInptLay.visibility = View.VISIBLE } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/example/todoapp/TaskReceiver.kt b/app/src/main/java/com/example/todoapp/TaskReceiver.kt new file mode 100644 index 0000000..214a573 --- /dev/null +++ b/app/src/main/java/com/example/todoapp/TaskReceiver.kt @@ -0,0 +1,32 @@ +package com.example.todoapp + +import android.app.Notification +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import androidx.core.app.NotificationCompat + + +class TaskReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + + val nm = + context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val pendingIntent = PendingIntent.getActivity( + context, 123, Intent( + context, + MainActivity::class.java + ), + PendingIntent.FLAG_UPDATE_CURRENT + ) + val notification = NotificationCompat.Builder(context,"one") + .setContentTitle(intent.getStringExtra("TASK")) + .setContentText(intent.getStringExtra("Des")) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentIntent(pendingIntent) + .build() + nm.notify(System.currentTimeMillis().toInt(), notification) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/todoapp/TodoDao.kt b/app/src/main/java/com/example/todoapp/TodoDao.kt index 2478406..bb03c27 100644 --- a/app/src/main/java/com/example/todoapp/TodoDao.kt +++ b/app/src/main/java/com/example/todoapp/TodoDao.kt @@ -19,4 +19,11 @@ interface TodoDao { @Query("Delete from TodoModel where id=:uid") fun deleteTask(uid:Long) + + @Query("Select * from TodoModel where isFinished == 1") + fun getFinishedTask():LiveData> + + @Query("Delete from TodoModel where isFinished == 1") + fun delete_finished_task() + } \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index 2b068d1..1f6bb29 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -4,13 +4,17 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml index 1fd6752..0d004ac 100644 --- a/app/src/main/res/layout/activity_history.xml +++ b/app/src/main/res/layout/activity_history.xml @@ -1,9 +1,40 @@ - - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f20e335..9dcf042 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,6 +6,7 @@ android:layout_height="match_parent" tools:context=".MainActivity"> + - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_task.xml b/app/src/main/res/layout/activity_task.xml index 3748fc1..d9a0bc6 100644 --- a/app/src/main/res/layout/activity_task.xml +++ b/app/src/main/res/layout/activity_task.xml @@ -15,11 +15,11 @@ + app:popupTheme="@style/AppTheme.PopupOverlay" + app:title="New Task" /> @@ -34,21 +34,21 @@ android:textSize="16sp" /> + android:layout_marginBottom="16dp" + app:boxStrokeColor="@color/colorAccent" + app:hintTextColor="@color/colorAccent"> @@ -63,21 +63,21 @@ android:textSize="16sp" /> + android:layout_marginBottom="16dp" + app:boxStrokeColor="@color/colorAccent" + app:hintTextColor="@color/colorAccent"> @@ -96,70 +96,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" - app:hintTextColor="@color/colorAccent" - app:boxStrokeColor="@color/colorAccent" android:layout_marginEnd="16dp" - android:layout_marginBottom="16dp"> + android:layout_marginBottom="16dp" + app:boxStrokeColor="@color/colorAccent" + app:hintTextColor="@color/colorAccent"> + + + app:hintTextColor="@color/colorAccent"> + android:textSize="18sp" + /> + + android:orientation="horizontal"> + android:layout_marginEnd="16dp" + android:layout_weight="1" /> - - + android:text="Save Task" + app:backgroundTint="@color/colorAccent" + app:cornerRadius="25dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/alert.xml b/app/src/main/res/layout/alert.xml new file mode 100644 index 0000000..d585740 --- /dev/null +++ b/app/src/main/res/layout/alert.xml @@ -0,0 +1,29 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/history.xml b/app/src/main/res/menu/history.xml new file mode 100644 index 0000000..25409f2 --- /dev/null +++ b/app/src/main/res/menu/history.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2e30014..fc9f684 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -28,4 +28,4 @@ #bdbdbd #78909c - + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b11ee25..eb8ed1f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -12,4 +12,4 @@