Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ dependencies {
implementation(libs.material)
implementation(libs.activity)
implementation(libs.constraintlayout)
implementation("com.mapbox.maps:android:10.9.1")
implementation("androidx.room:room-runtime:2.8.2")
annotationProcessor("androidx.room:room-compiler:2.8.2")
}
9 changes: 6 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
xmlns:tools="http://schemas.android.com/tools">

<application
android:allowBackup="true"
Expand All @@ -11,13 +11,16 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TODOList"
tools:targetApi="31" >
tools:targetApi="31">
<activity
android:name=".activity.MapActivity"
android:exported="false" />
<activity
android:name=".activity.RegisterTaskActivity"
android:exported="false" />
<activity
android:name=".activity.MainActivity"
android:exported="true" >
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
Expand Down Expand Up @@ -69,6 +66,11 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
Intent intent = new Intent(this, RegisterTaskActivity.class);
startActivity(intent);

return true;
} else if (item.getItemId() == R.id.tasks_map_item) {
Intent intent = new Intent(this, MapActivity.class);
startActivity(intent);

return true;
}

Expand Down
51 changes: 51 additions & 0 deletions app/src/main/java/com/svalero/todolist/activity/MapActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.svalero.todolist.activity;

import android.graphics.BitmapFactory;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import com.mapbox.geojson.Point;
import com.mapbox.maps.MapView;
import com.mapbox.maps.Style;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions;
import com.svalero.todolist.R;
import com.svalero.todolist.db.AppDatabase;
import com.svalero.todolist.db.DatabaseUtil;
import com.svalero.todolist.domain.Task;
import com.svalero.todolist.util.MapUtils;

import java.util.List;

public class MapActivity extends AppCompatActivity implements Style.OnStyleLoaded {

private MapView mapView;
private PointAnnotationManager pointAnnotationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);

mapView = findViewById(R.id.mainMap);
mapView.getMapboxMap().loadStyleUri(Style.MAPBOX_STREETS, this);

pointAnnotationManager = MapUtils.buildAnnotationManager(mapView);
}

@Override
public void onStyleLoaded(@NonNull Style style) {
final AppDatabase db = DatabaseUtil.getDb(this);
List<Task> allTasks = db.taskDao().findAll();
showTasksAsMarkers(allTasks);
}

private void showTasksAsMarkers(List<Task> tasks) {
tasks.forEach(task -> {
Point point = Point.fromLngLat(task.getLongitude(), task.getLatitude());
MapUtils.addMarker(this, pointAnnotationManager, point, task.getName());
});
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,58 @@
package com.svalero.todolist.activity;

import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.mapbox.geojson.Point;
import com.mapbox.maps.MapView;
import com.mapbox.maps.Style;
import com.mapbox.maps.plugin.annotation.AnnotationConfig;
import com.mapbox.maps.plugin.annotation.AnnotationPlugin;
import com.mapbox.maps.plugin.annotation.AnnotationPluginImplKt;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManagerKt;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions;
import com.mapbox.maps.plugin.gestures.GesturesPlugin;
import com.mapbox.maps.plugin.gestures.GesturesUtils;
import com.mapbox.maps.plugin.gestures.OnMapClickListener;
import com.svalero.todolist.R;
import com.svalero.todolist.db.AppDatabase;
import com.svalero.todolist.db.DatabaseUtil;
import com.svalero.todolist.domain.Task;
import com.svalero.todolist.util.MapUtils;

public class RegisterTaskActivity extends AppCompatActivity {
public class RegisterTaskActivity extends AppCompatActivity implements OnMapClickListener {

private MapView mapView;
private GesturesPlugin gesturesPlugin;
private PointAnnotationManager pointAnnotationManager;
private Point currentPoint;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_task);

mapView = findViewById(R.id.mapView);
mapView.getMapboxMap().loadStyleUri(Style.MAPBOX_STREETS);

initializeGesturesPlugin();
pointAnnotationManager = MapUtils.buildAnnotationManager(mapView);
}

@Override
public boolean onMapClick(@NonNull Point point) {
pointAnnotationManager.deleteAll();
currentPoint = point;
MapUtils.addMarker(this, pointAnnotationManager, point);
return false;
}

public void addTask(View view) {
Expand All @@ -35,14 +65,20 @@ public void addTask(View view) {
boolean done = cbTaskDone.isChecked();
// TODO Validar entrada

Task task = new Task(name, description, done);
Task task = new Task(name, description, done, currentPoint.latitude(), currentPoint.longitude());
final AppDatabase db = DatabaseUtil.getDb(this);
db.taskDao().insert(task);

Toast.makeText(this, R.string.task_added, Toast.LENGTH_SHORT).show();
etTaskName.setText("");
etTaskDescription.setText("");
cbTaskDone.setChecked(false);
pointAnnotationManager.deleteAll();
etTaskName.requestFocus();
}

private void initializeGesturesPlugin() {
gesturesPlugin = GesturesUtils.getGestures(mapView);
gesturesPlugin.addOnMapClickListener(this);
}
}
24 changes: 23 additions & 1 deletion app/src/main/java/com/svalero/todolist/domain/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,22 @@ public class Task {
private String description;
@ColumnInfo
private boolean done;
@ColumnInfo
private double latitude;
@ColumnInfo
private double longitude;

@Ignore
public Task(String name) {
this.name = name;
}

public Task(String name, String description, boolean done) {
public Task(String name, String description, boolean done, double latitude, double longitude) {
this.name = name;
this.description = description;
this.done = done;
this.latitude = latitude;
this.longitude = longitude;
}

public int getId() {
Expand Down Expand Up @@ -58,4 +64,20 @@ public boolean isDone() {
public void setDone(boolean done) {
this.done = done;
}

public double getLatitude() {
return latitude;
}

public void setLatitude(double latitude) {
this.latitude = latitude;
}

public double getLongitude() {
return longitude;
}

public void setLongitude(double longitude) {
this.longitude = longitude;
}
}
37 changes: 37 additions & 0 deletions app/src/main/java/com/svalero/todolist/util/MapUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.svalero.todolist.util;

import android.content.Context;
import android.graphics.BitmapFactory;

import com.mapbox.geojson.Point;
import com.mapbox.maps.MapView;
import com.mapbox.maps.plugin.annotation.AnnotationConfig;
import com.mapbox.maps.plugin.annotation.AnnotationPlugin;
import com.mapbox.maps.plugin.annotation.AnnotationPluginImplKt;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManagerKt;
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions;
import com.svalero.todolist.R;

public class MapUtils {

public static PointAnnotationManager buildAnnotationManager(MapView mapView) {
AnnotationPlugin annotationPlugin = AnnotationPluginImplKt.getAnnotations(mapView);
AnnotationConfig annotationConfig = new AnnotationConfig();
return PointAnnotationManagerKt.createPointAnnotationManager(
annotationPlugin, annotationConfig);
}

public static void addMarker(Context context, PointAnnotationManager pointAnnotationManager,
Point point, String message) {
PointAnnotationOptions annotationOptions = new PointAnnotationOptions()
.withPoint(point)
.withIconImage(BitmapFactory.decodeResource(context.getResources(), R.mipmap.red_marker_foreground))
.withTextField(message);
pointAnnotationManager.create(annotationOptions);
}

public static void addMarker(Context context, PointAnnotationManager pointAnnotationManager, Point point) {
addMarker(context, pointAnnotationManager, point, context.getResources().getString(R.string.here));
}
}
Binary file added app/src/main/red_marker-playstore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
78 changes: 78 additions & 0 deletions app/src/main/res/drawable/red_marker_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group android:scaleX="1.01"
android:scaleY="1.01"
android:translateX="-0.54"
android:translateY="-0.54">
<path android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z"/>
<path android:fillColor="#00000000" android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
</group>
</vector>
21 changes: 21 additions & 0 deletions app/src/main/res/layout/activity_map.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MapActivity">

<com.mapbox.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:mapbox="http://schemas.android.com/apk/res-auto"
android:id="@+id/mainMap"
android:layout_width="match_parent"
android:layout_height="match_parent"
mapbox:mapbox_cameraTargetLat="41.65606"
mapbox:mapbox_cameraTargetLng="-0.87734"
mapbox:mapbox_cameraZoom="9.0"
/>

</androidx.constraintlayout.widget.ConstraintLayout>
Loading