diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 25f99e8..c9d57b1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 64810e3..1a0f1df 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> + tools:targetApi="31"> + + android:exported="true"> diff --git a/app/src/main/java/com/svalero/todolist/activity/MainActivity.java b/app/src/main/java/com/svalero/todolist/activity/MainActivity.java index 31f7501..cc061ca 100644 --- a/app/src/main/java/com/svalero/todolist/activity/MainActivity.java +++ b/app/src/main/java/com/svalero/todolist/activity/MainActivity.java @@ -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; @@ -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; } diff --git a/app/src/main/java/com/svalero/todolist/activity/MapActivity.java b/app/src/main/java/com/svalero/todolist/activity/MapActivity.java new file mode 100644 index 0000000..4a4bac2 --- /dev/null +++ b/app/src/main/java/com/svalero/todolist/activity/MapActivity.java @@ -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 allTasks = db.taskDao().findAll(); + showTasksAsMarkers(allTasks); + } + + private void showTasksAsMarkers(List tasks) { + tasks.forEach(task -> { + Point point = Point.fromLngLat(task.getLongitude(), task.getLatitude()); + MapUtils.addMarker(this, pointAnnotationManager, point, task.getName()); + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/svalero/todolist/activity/RegisterTaskActivity.java b/app/src/main/java/com/svalero/todolist/activity/RegisterTaskActivity.java index 0aa9cf6..0d04246 100644 --- a/app/src/main/java/com/svalero/todolist/activity/RegisterTaskActivity.java +++ b/app/src/main/java/com/svalero/todolist/activity/RegisterTaskActivity.java @@ -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) { @@ -35,7 +65,7 @@ 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); @@ -43,6 +73,12 @@ public void addTask(View view) { etTaskName.setText(""); etTaskDescription.setText(""); cbTaskDone.setChecked(false); + pointAnnotationManager.deleteAll(); etTaskName.requestFocus(); } + + private void initializeGesturesPlugin() { + gesturesPlugin = GesturesUtils.getGestures(mapView); + gesturesPlugin.addOnMapClickListener(this); + } } \ No newline at end of file diff --git a/app/src/main/java/com/svalero/todolist/domain/Task.java b/app/src/main/java/com/svalero/todolist/domain/Task.java index bb31c83..35ae4a6 100644 --- a/app/src/main/java/com/svalero/todolist/domain/Task.java +++ b/app/src/main/java/com/svalero/todolist/domain/Task.java @@ -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() { @@ -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; + } } diff --git a/app/src/main/java/com/svalero/todolist/util/MapUtils.java b/app/src/main/java/com/svalero/todolist/util/MapUtils.java new file mode 100644 index 0000000..561608d --- /dev/null +++ b/app/src/main/java/com/svalero/todolist/util/MapUtils.java @@ -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)); + } +} diff --git a/app/src/main/red_marker-playstore.png b/app/src/main/red_marker-playstore.png new file mode 100644 index 0000000..fc179e2 Binary files /dev/null and b/app/src/main/red_marker-playstore.png differ diff --git a/app/src/main/res/drawable/red_marker_background.xml b/app/src/main/res/drawable/red_marker_background.xml new file mode 100644 index 0000000..d71cad8 --- /dev/null +++ b/app/src/main/res/drawable/red_marker_background.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml new file mode 100644 index 0000000..3917886 --- /dev/null +++ b/app/src/main/res/layout/activity_map.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_register_task.xml b/app/src/main/res/layout/activity_register_task.xml index d35d7b5..d6b55ac 100644 --- a/app/src/main/res/layout/activity_register_task.xml +++ b/app/src/main/res/layout/activity_register_task.xml @@ -9,6 +9,7 @@ tools:context=".activity.RegisterTaskActivity"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index 4873b26..171a23a 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -7,4 +7,9 @@ android:icon="@android:drawable/ic_input_add" android:title="@string/register" app:showAsAction="always" /> + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/red_marker.xml b/app/src/main/res/mipmap-anydpi-v26/red_marker.xml new file mode 100644 index 0000000..e886c84 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/red_marker.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/red_marker_round.xml b/app/src/main/res/mipmap-anydpi-v26/red_marker_round.xml new file mode 100644 index 0000000..e886c84 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/red_marker_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/red_marker.webp b/app/src/main/res/mipmap-hdpi/red_marker.webp new file mode 100644 index 0000000..29c382c Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/red_marker.webp differ diff --git a/app/src/main/res/mipmap-hdpi/red_marker_foreground.png b/app/src/main/res/mipmap-hdpi/red_marker_foreground.png new file mode 100644 index 0000000..03937ee Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/red_marker_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/red_marker_round.png b/app/src/main/res/mipmap-hdpi/red_marker_round.png new file mode 100644 index 0000000..4888d61 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/red_marker_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/red_marker.webp b/app/src/main/res/mipmap-mdpi/red_marker.webp new file mode 100644 index 0000000..8ba9c20 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/red_marker.webp differ diff --git a/app/src/main/res/mipmap-mdpi/red_marker_foreground.png b/app/src/main/res/mipmap-mdpi/red_marker_foreground.png new file mode 100644 index 0000000..6b329f7 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/red_marker_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/red_marker_round.png b/app/src/main/res/mipmap-mdpi/red_marker_round.png new file mode 100644 index 0000000..93197e8 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/red_marker_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/red_marker.webp b/app/src/main/res/mipmap-xhdpi/red_marker.webp new file mode 100644 index 0000000..0b32613 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/red_marker.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/red_marker_foreground.png b/app/src/main/res/mipmap-xhdpi/red_marker_foreground.png new file mode 100644 index 0000000..5e2a081 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/red_marker_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/red_marker_round.png b/app/src/main/res/mipmap-xhdpi/red_marker_round.png new file mode 100644 index 0000000..54ccb84 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/red_marker_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/red_marker.webp b/app/src/main/res/mipmap-xxhdpi/red_marker.webp new file mode 100644 index 0000000..a0718c0 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/red_marker.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/red_marker_foreground.png b/app/src/main/res/mipmap-xxhdpi/red_marker_foreground.png new file mode 100644 index 0000000..23e6618 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/red_marker_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/red_marker_round.png b/app/src/main/res/mipmap-xxhdpi/red_marker_round.png new file mode 100644 index 0000000..809812e Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/red_marker_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/red_marker.webp b/app/src/main/res/mipmap-xxxhdpi/red_marker.webp new file mode 100644 index 0000000..02b581e Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/red_marker.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/red_marker_foreground.png b/app/src/main/res/mipmap-xxxhdpi/red_marker_foreground.png new file mode 100644 index 0000000..ff3beaa Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/red_marker_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/red_marker_round.png b/app/src/main/res/mipmap-xxxhdpi/red_marker_round.png new file mode 100644 index 0000000..2a5d489 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/red_marker_round.png differ diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6b73d02..a96307d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -7,4 +7,5 @@ Register Task description Task added + See map \ No newline at end of file diff --git a/app/src/main/res/values/developer-config.xml b/app/src/main/res/values/developer-config.xml new file mode 100644 index 0000000..d5ce434 --- /dev/null +++ b/app/src/main/res/values/developer-config.xml @@ -0,0 +1,4 @@ + + + pk.eyJ1Ijgsdg34g4vsJxc2Q0aW5jM2QxeCJ9.04Uqv_UDYkZqVp7XCgvzMg + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fc62b61..79eb2af 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,4 +8,6 @@ Task description Task name Task added + See map + Here \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 07c116b..f333739 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,6 +16,20 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + + maven { + url = uri("https://api.mapbox.com/downloads/v2/releases/maven") + authentication { + create("basic") + } + credentials { + // Do not change the username below. + // This should always be `mapbox` (not your username). + username = "mapbox" + // Use the secret token you stored in gradle.properties as the password + password = "sk.eyJ1Ijoic2ZhsdfsdfsdfsdfNhMDBsbDJrc2IxNmNsZmc0NiJ9.9RzoO-WCt_DZ27Rnrjj3bQ" + } + } } }