Skip to content

Commit 50c764d

Browse files
committed
TODOList v1
0 parents  commit 50c764d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1227
-0
lines changed

.gitignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
.idea
2+
*.iml
3+
.gradle
4+
/local.properties
5+
/.idea/caches
6+
/.idea/libraries
7+
/.idea/modules.xml
8+
/.idea/workspace.xml
9+
/.idea/navEditor.xml
10+
/.idea/assetWizardSettings.xml
11+
.DS_Store
12+
/build
13+
/captures
14+
.externalNativeBuild
15+
.cxx
16+
local.properties

app/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

app/build.gradle.kts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
plugins {
2+
alias(libs.plugins.android.application)
3+
}
4+
5+
android {
6+
namespace = "com.svalero.todolist"
7+
compileSdk = 35
8+
9+
defaultConfig {
10+
applicationId = "com.svalero.todolist"
11+
minSdk = 28
12+
targetSdk = 35
13+
versionCode = 1
14+
versionName = "1.0"
15+
16+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
17+
}
18+
19+
buildTypes {
20+
release {
21+
isMinifyEnabled = false
22+
proguardFiles(
23+
getDefaultProguardFile("proguard-android-optimize.txt"),
24+
"proguard-rules.pro"
25+
)
26+
}
27+
}
28+
compileOptions {
29+
sourceCompatibility = JavaVersion.VERSION_11
30+
targetCompatibility = JavaVersion.VERSION_11
31+
}
32+
}
33+
34+
dependencies {
35+
36+
implementation(libs.appcompat)
37+
implementation(libs.material)
38+
implementation(libs.activity)
39+
implementation(libs.constraintlayout)
40+
implementation("androidx.room:room-runtime:2.8.2")
41+
annotationProcessor("androidx.room:room-compiler:2.8.2")
42+
}

app/proguard-rules.pro

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Add project specific ProGuard rules here.
2+
# You can control the set of applied configuration files using the
3+
# proguardFiles setting in build.gradle.
4+
#
5+
# For more details, see
6+
# http://developer.android.com/guide/developing/tools/proguard.html
7+
8+
# If your project uses WebView with JS, uncomment the following
9+
# and specify the fully qualified class name to the JavaScript interface
10+
# class:
11+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12+
# public *;
13+
#}
14+
15+
# Uncomment this to preserve the line number information for
16+
# debugging stack traces.
17+
#-keepattributes SourceFile,LineNumberTable
18+
19+
# If you keep the line number information, uncomment this to
20+
# hide the original source file name.
21+
#-renamesourcefileattribute SourceFile

app/src/main/AndroidManifest.xml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools" >
4+
5+
<application
6+
android:allowBackup="true"
7+
android:dataExtractionRules="@xml/data_extraction_rules"
8+
android:fullBackupContent="@xml/backup_rules"
9+
android:icon="@mipmap/ic_launcher"
10+
android:label="@string/app_name"
11+
android:roundIcon="@mipmap/ic_launcher_round"
12+
android:supportsRtl="true"
13+
android:theme="@style/Theme.TODOList"
14+
tools:targetApi="31" >
15+
<activity
16+
android:name=".activity.RegisterTaskActivity"
17+
android:exported="false" />
18+
<activity
19+
android:name=".activity.MainActivity"
20+
android:exported="true" >
21+
<intent-filter>
22+
<action android:name="android.intent.action.MAIN" />
23+
24+
<category android:name="android.intent.category.LAUNCHER" />
25+
</intent-filter>
26+
</activity>
27+
</application>
28+
29+
</manifest>
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.svalero.todolist.activity;
2+
3+
import android.content.Intent;
4+
import android.os.Bundle;
5+
import android.view.Menu;
6+
import android.view.MenuItem;
7+
import android.view.View;
8+
import android.widget.EditText;
9+
import android.widget.Toast;
10+
11+
import androidx.annotation.NonNull;
12+
import androidx.appcompat.app.AppCompatActivity;
13+
import androidx.recyclerview.widget.LinearLayoutManager;
14+
import androidx.recyclerview.widget.RecyclerView;
15+
16+
import com.svalero.todolist.R;
17+
import com.svalero.todolist.adapter.TaskAdapter;
18+
import com.svalero.todolist.db.AppDatabase;
19+
import com.svalero.todolist.db.DatabaseUtil;
20+
import com.svalero.todolist.domain.Task;
21+
22+
import java.util.ArrayList;
23+
import java.util.List;
24+
25+
public class MainActivity extends AppCompatActivity {
26+
27+
List<Task> taskList;
28+
private TaskAdapter taskAdapter;
29+
30+
@Override
31+
protected void onCreate(Bundle savedInstanceState) {
32+
super.onCreate(savedInstanceState);
33+
setContentView(R.layout.activity_main);
34+
35+
taskList = new ArrayList<>();
36+
37+
RecyclerView todoList = findViewById(R.id.todoList);
38+
todoList.setHasFixedSize(true);
39+
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
40+
todoList.setLayoutManager(linearLayoutManager);
41+
taskAdapter = new TaskAdapter(this, taskList);
42+
todoList.setAdapter(taskAdapter);
43+
}
44+
45+
@Override
46+
protected void onResume() {
47+
super.onResume();
48+
49+
refreshTodoList();
50+
}
51+
52+
private void refreshTodoList() {
53+
final AppDatabase db = DatabaseUtil.getDb(this);
54+
taskList.clear();
55+
taskList.addAll(db.taskDao().findAll());
56+
57+
taskAdapter.notifyDataSetChanged();
58+
}
59+
60+
@Override
61+
public boolean onCreateOptionsMenu(Menu menu) {
62+
getMenuInflater().inflate(R.menu.main_menu, menu);
63+
return true;
64+
}
65+
66+
@Override
67+
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
68+
if (item.getItemId() == R.id.register_task_item) {
69+
Intent intent = new Intent(this, RegisterTaskActivity.class);
70+
startActivity(intent);
71+
72+
return true;
73+
}
74+
75+
return super.onOptionsItemSelected(item);
76+
}
77+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.svalero.todolist.activity;
2+
3+
import android.os.Bundle;
4+
import android.view.View;
5+
import android.widget.CheckBox;
6+
import android.widget.EditText;
7+
import android.widget.Toast;
8+
9+
import androidx.activity.EdgeToEdge;
10+
import androidx.appcompat.app.AppCompatActivity;
11+
import androidx.core.graphics.Insets;
12+
import androidx.core.view.ViewCompat;
13+
import androidx.core.view.WindowInsetsCompat;
14+
15+
import com.svalero.todolist.R;
16+
import com.svalero.todolist.db.AppDatabase;
17+
import com.svalero.todolist.db.DatabaseUtil;
18+
import com.svalero.todolist.domain.Task;
19+
20+
public class RegisterTaskActivity extends AppCompatActivity {
21+
22+
@Override
23+
protected void onCreate(Bundle savedInstanceState) {
24+
super.onCreate(savedInstanceState);
25+
setContentView(R.layout.activity_register_task);
26+
}
27+
28+
public void addTask(View view) {
29+
EditText etTaskName = findViewById(R.id.task_name);
30+
EditText etTaskDescription = findViewById(R.id.task_description);
31+
CheckBox cbTaskDone = findViewById(R.id.task_done);
32+
33+
String name = etTaskName.getText().toString();
34+
String description = etTaskDescription.getText().toString();
35+
boolean done = cbTaskDone.isChecked();
36+
// TODO Validar entrada
37+
38+
Task task = new Task(name, description, done);
39+
final AppDatabase db = DatabaseUtil.getDb(this);
40+
db.taskDao().insert(task);
41+
42+
Toast.makeText(this, R.string.task_added, Toast.LENGTH_SHORT).show();
43+
etTaskName.setText("");
44+
etTaskDescription.setText("");
45+
cbTaskDone.setChecked(false);
46+
etTaskName.requestFocus();
47+
}
48+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.svalero.todolist.adapter;
2+
3+
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.Button;
8+
import android.widget.TextView;
9+
10+
import androidx.annotation.NonNull;
11+
import androidx.recyclerview.widget.RecyclerView;
12+
13+
import com.svalero.todolist.R;
14+
import com.svalero.todolist.db.AppDatabase;
15+
import com.svalero.todolist.db.DatabaseUtil;
16+
import com.svalero.todolist.domain.Task;
17+
18+
import java.util.List;
19+
20+
public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskHolder> {
21+
22+
private Context context;
23+
private List<Task> taskList;
24+
25+
public TaskAdapter(Context context, List<Task> taskList) {
26+
this.context = context;
27+
this.taskList = taskList;
28+
}
29+
30+
@NonNull
31+
@Override
32+
public TaskAdapter.TaskHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
33+
View itemView = LayoutInflater.from(parent.getContext())
34+
.inflate(R.layout.todolist_item, parent, false);
35+
return new TaskHolder(itemView);
36+
}
37+
38+
@Override
39+
public void onBindViewHolder(@NonNull TaskAdapter.TaskHolder holder, int position) {
40+
holder.itemTaskName.setText(taskList.get(position).getName());
41+
holder.itemTaskDescription.setText(taskList.get(position).getDescription());
42+
}
43+
44+
@Override
45+
public int getItemCount() {
46+
return taskList.size();
47+
}
48+
49+
public class TaskHolder extends RecyclerView.ViewHolder {
50+
51+
private TextView itemTaskName;
52+
private TextView itemTaskDescription;
53+
private Button deleteItemTaskButton;
54+
55+
public TaskHolder(@NonNull View itemView) {
56+
super(itemView);
57+
58+
itemTaskName = itemView.findViewById(R.id.itemTaskName);
59+
itemTaskDescription = itemView.findViewById(R.id.itemTaskDescription);
60+
deleteItemTaskButton = itemView.findViewById(R.id.deleteItemTaskButton);
61+
62+
deleteItemTaskButton.setOnClickListener(view -> {
63+
final AppDatabase db = DatabaseUtil.getDb(context);
64+
db.taskDao().deleteByName(itemTaskName.getText().toString());
65+
66+
int position = getAdapterPosition();
67+
taskList.remove(position);
68+
notifyItemRemoved(position);
69+
});
70+
71+
// FIXME Ver donde encajar eso para que funcione correctamente
72+
// int position = getAdapterPosition();
73+
// Task task = taskList.get(position);
74+
// if (task.isDone()) {
75+
// itemView.setBackgroundColor(itemView.getContext().getResources().getColor(
76+
// android.R.color.holo_green_light, itemView.getContext().getTheme()
77+
// ));
78+
// } else {
79+
// itemView.setBackgroundColor(itemView.getContext().getResources().getColor(
80+
// android.R.color.holo_red_light, itemView.getContext().getTheme()
81+
// ));
82+
// }
83+
}
84+
}
85+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.svalero.todolist.db;
2+
3+
import androidx.room.Database;
4+
import androidx.room.RoomDatabase;
5+
6+
import com.svalero.todolist.domain.Task;
7+
8+
@Database(entities = {Task.class}, version = 1)
9+
public abstract class AppDatabase extends RoomDatabase {
10+
public abstract TaskDao taskDao();
11+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.svalero.todolist.db;
2+
3+
import static com.svalero.todolist.util.Constants.DATABASE_NAME;
4+
5+
import android.content.Context;
6+
7+
import androidx.room.Room;
8+
9+
public class DatabaseUtil {
10+
11+
public static AppDatabase getDb(Context context) {
12+
return Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME)
13+
.allowMainThreadQueries().build();
14+
}
15+
}

0 commit comments

Comments
 (0)