From 6ac9f0f5355e994e14b6a5fc5c3d691285665560 Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 16:19:14 +0100 Subject: [PATCH 01/30] [Lab 06] 02 - Modified loading of spots in SpotListActivity.kt --- .../activities/SpotActivity.kt | 1 - .../activities/SpotListActivity.kt | 15 ++++++++++++--- .../com/archaeologicalfieldwork/main/MainApp.kt | 4 +++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt index 2e7ba5a..5c59f5b 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt @@ -65,7 +65,6 @@ class SpotActivity : AppCompatActivity(), AnkoLogger { app.spots.create(spot.copy()) } info("add Button pressed: ${spot}") - app.spots.logAll() setResult(AppCompatActivity.RESULT_OK) finish() } diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt index 85d9d5e..097a456 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt @@ -13,7 +13,6 @@ import com.archaeologicalfieldwork.R import com.archaeologicalfieldwork.main.MainApp import com.archaeologicalfieldwork.models.SpotModel - class SpotListActivity : AppCompatActivity(), SpotListener, AnkoLogger { lateinit var app: MainApp @@ -28,7 +27,16 @@ class SpotListActivity : AppCompatActivity(), SpotListener, AnkoLogger { val layoutManager = LinearLayoutManager(this) recyclerView.layoutManager = layoutManager - recyclerView.adapter = SpotAdapter(app.spots.findAll(), this) + loadSpots() + } + + private fun loadSpots() { + showSpots(app.spots.findAll()) + } + + fun showSpots(spots: List) { + recyclerView.adapter = SpotAdapter(spots, this) + recyclerView.adapter?.notifyDataSetChanged() } override fun onCreateOptionsMenu(menu: Menu?): Boolean { @@ -48,7 +56,8 @@ class SpotListActivity : AppCompatActivity(), SpotListener, AnkoLogger { } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - recyclerView.adapter?.notifyDataSetChanged() + loadSpots() super.onActivityResult(requestCode, resultCode, data) } + } \ No newline at end of file diff --git a/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt b/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt index 5cc66f7..0f3978e 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt @@ -4,13 +4,15 @@ import android.app.Application import org.jetbrains.anko.info import org.jetbrains.anko.AnkoLogger import com.archaeologicalfieldwork.models.SpotMemStore +import com.archaeologicalfieldwork.models.SpotStore class MainApp : Application(), AnkoLogger { - val spots = SpotMemStore() + lateinit var spots: SpotStore override fun onCreate() { super.onCreate() + spots = SpotMemStore() info("Archaelogical Fieldwork started") } } \ No newline at end of file From 993a0482acbb7865c6023de461032a0e2545551c Mon Sep 17 00:00:00 2001 From: Philipp Luxi <53474650+philippluxi@users.noreply.github.com> Date: Fri, 1 Jan 2021 16:26:13 +0100 Subject: [PATCH 02/30] [README] - Modified ReadMe - Added Hint on API Keys --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 332b55c..d8ad771 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,11 @@ Repository for submission for the Android programming course at the OTH Regensbu ### Purpose of the application In the final version, places are to be stored, displayed and managed together with title, description and pictures. In an extended version, the data storage takes place in Firebase and notes and ratings can be given for the places. +# + +### Custom Files +#### API Keys +In order to clone the repo and run the app, the following files must be created manually and a custom Maps-API-Key must be provided. +- /app/src/release/res/values/google_maps_api.xml +- /app/src/debug/res/values/google_maps_api.xml + From 88a1291c9b0d8f719d304134d4bc9518055b2b0a Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 16:29:30 +0100 Subject: [PATCH 03/30] [Lab 06] 04 - Introduced File Helper Class --- .../helpers/FileHelpers.kt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 app/src/main/java/com/archaeologicalfieldwork/helpers/FileHelpers.kt diff --git a/app/src/main/java/com/archaeologicalfieldwork/helpers/FileHelpers.kt b/app/src/main/java/com/archaeologicalfieldwork/helpers/FileHelpers.kt new file mode 100644 index 0000000..a8bf678 --- /dev/null +++ b/app/src/main/java/com/archaeologicalfieldwork/helpers/FileHelpers.kt @@ -0,0 +1,46 @@ +package com.archaeologicalfieldwork.helpers + +import android.content.Context +import android.util.Log +import java.io.* + +fun write(context: Context, fileName: String, data: String) { + try { + val outputStreamWriter = + OutputStreamWriter(context.openFileOutput(fileName, Context.MODE_PRIVATE)) + outputStreamWriter.write(data) + outputStreamWriter.close() + } catch (e: Exception) { + Log.e("Error: ", "Cannot read file: " + e.toString()); + } +} + +fun read(context: Context, fileName: String): String { + var str = "" + try { + val inputStream = context.openFileInput(fileName) + if (inputStream != null) { + val inputStreamReader = InputStreamReader(inputStream) + val bufferedReader = BufferedReader(inputStreamReader) + val partialStr = StringBuilder() + var done = false + while (!done) { + var line = bufferedReader.readLine() + done = (line == null); + if (line != null) partialStr.append(line); + } + inputStream.close() + str = partialStr.toString() + } + } catch (e: FileNotFoundException) { + Log.e("Error: ", "file not found: " + e.toString()); + } catch (e: IOException) { + Log.e("Error: ", "cannot read file: " + e.toString()); + } + return str +} + +fun exists(context: Context, filename: String): Boolean { + val file = context.getFileStreamPath(filename) + return file.exists() +} \ No newline at end of file From 4f1cca082f4d96ee0c8ebc530e668d38a5e98cb2 Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 16:44:07 +0100 Subject: [PATCH 04/30] [Lab 06] 05 - Introduced SpotJSONStore.kt, adapted gradle --- app/build.gradle | 2 + .../models/SpotJSONStore.kt | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt diff --git a/app/build.gradle b/app/build.gradle index 7709e54..9a56e6d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,4 +42,6 @@ dependencies { //Material Design implementation 'com.google.android.material:material:1.2.0' + // Json Support for JSONStore + implementation 'com.google.code.gson:gson:2.8.6' } \ No newline at end of file diff --git a/app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt b/app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt new file mode 100644 index 0000000..4927a54 --- /dev/null +++ b/app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt @@ -0,0 +1,55 @@ +package com.archaeologicalfieldwork.models + +import android.content.Context +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.google.gson.reflect.TypeToken +import org.jetbrains.anko.AnkoLogger +import java.util.* +import com.archaeologicalfieldwork.helpers.* + +val JSON_FILE = "spots.json" +val gsonBuilder = GsonBuilder().setPrettyPrinting().create() +val listType = object : TypeToken>() {}.type + +fun generateRandomId(): Long { + return Random().nextLong() +} + +class SpotJSONStore : SpotStore, AnkoLogger { + + val context: Context + var spots = mutableListOf() + + constructor (context: Context) { + this.context = context + if (exists(context, JSON_FILE)) { + deserialize() + } + } + + override fun findAll(): MutableList { + return spots + } + + override fun create(spot: SpotModel) { + spot.id = generateRandomId() + spots.add(spot) + serialize() + } + + + override fun update(spot: SpotModel) { + // todo + } + + private fun serialize() { + val jsonString = gsonBuilder.toJson(spots, listType) + write(context, JSON_FILE, jsonString) + } + + private fun deserialize() { + val jsonString = read(context, JSON_FILE) + spots = Gson().fromJson(jsonString, listType) + } +} \ No newline at end of file From 32c2c552b3e023238498feb3ed63eb4d4ade2618 Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 17:26:16 +0100 Subject: [PATCH 05/30] [Lab 06] Ex - Introduced Delete button, only visible when edit // small refactorings/typos corrected --- .../activities/SpotActivity.kt | 11 +++++++++-- .../activities/SpotAdapter.kt | 2 +- .../archaeologicalfieldwork/main/MainApp.kt | 3 ++- .../models/SpotJSONStore.kt | 19 +++++++++++++++++-- .../models/SpotMemStore.kt | 6 +++++- .../models/SpotModel.kt | 2 +- .../models/SpotStore.kt | 1 + app/src/main/res/menu/menu_new_spot.xml | 5 +++++ app/src/main/res/values/strings.xml | 3 +++ 9 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt index 5c59f5b..27a2d15 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotActivity.kt @@ -42,7 +42,7 @@ class SpotActivity : AppCompatActivity(), AnkoLogger { spot = intent.extras?.getParcelable("spot_edit")!! spotTitle.setText(spot.title) - spotDescription.setText(spot.desription) + spotDescription.setText(spot.description) spotImage.setImageBitmap(readImageFromPath(this, spot.image)) if (spot.image != null) { btnChooseImage.setText(R.string.change_spot_image) @@ -54,7 +54,7 @@ class SpotActivity : AppCompatActivity(), AnkoLogger { // Handle Add Button Press btnAddSpot.setOnClickListener() { spot.title = spotTitle.text.toString() - spot.desription = spotDescription.text.toString() + spot.description = spotDescription.text.toString() if (spot.title.isEmpty()) { toast(R.string.enter_spot_title) @@ -92,11 +92,18 @@ class SpotActivity : AppCompatActivity(), AnkoLogger { override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_new_spot, menu) + if (edit && menu != null) { + menu.getItem(0).isVisible = true + } return super.onCreateOptionsMenu(menu) } override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { + R.id.item_delete -> { + app.spots.delete(spot) + finish() + } R.id.item_cancel -> { finish() } diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotAdapter.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotAdapter.kt index 7df23c2..888f9f9 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotAdapter.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotAdapter.kt @@ -39,7 +39,7 @@ class SpotAdapter constructor( fun bind(spot: SpotModel, listener: SpotListener) { itemView.spotTitle_Card.text = spot.title - itemView.spotDescription_Card.text = spot.desription + itemView.spotDescription_Card.text = spot.description itemView.imageIcon.setImageBitmap(readImageFromPath(itemView.context, spot.image)) itemView.setOnClickListener { listener.onSpotClick(spot) } } diff --git a/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt b/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt index 0f3978e..f791661 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/main/MainApp.kt @@ -1,6 +1,7 @@ package com.archaeologicalfieldwork.main import android.app.Application +import com.archaeologicalfieldwork.models.SpotJSONStore import org.jetbrains.anko.info import org.jetbrains.anko.AnkoLogger import com.archaeologicalfieldwork.models.SpotMemStore @@ -12,7 +13,7 @@ class MainApp : Application(), AnkoLogger { override fun onCreate() { super.onCreate() - spots = SpotMemStore() + spots = SpotJSONStore(applicationContext) info("Archaelogical Fieldwork started") } } \ No newline at end of file diff --git a/app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt b/app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt index 4927a54..6c02aee 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/models/SpotJSONStore.kt @@ -7,6 +7,7 @@ import com.google.gson.reflect.TypeToken import org.jetbrains.anko.AnkoLogger import java.util.* import com.archaeologicalfieldwork.helpers.* +import kotlin.collections.ArrayList val JSON_FILE = "spots.json" val gsonBuilder = GsonBuilder().setPrettyPrinting().create() @@ -38,9 +39,23 @@ class SpotJSONStore : SpotStore, AnkoLogger { serialize() } - override fun update(spot: SpotModel) { - // todo + val spotList = findAll() as ArrayList + var foundSpot: SpotModel? = spotList.find { s -> s.id == spot.id } + if (foundSpot != null) { + foundSpot.title = spot.title + foundSpot.description = spot.description + foundSpot.image = spot.image + foundSpot.lat = spot.lat + foundSpot.lng = spot.lng + foundSpot.zoom = spot.zoom + } + serialize() + } + + override fun delete(spot: SpotModel) { + spots.remove(spot) + serialize() } private fun serialize() { diff --git a/app/src/main/java/com/archaeologicalfieldwork/models/SpotMemStore.kt b/app/src/main/java/com/archaeologicalfieldwork/models/SpotMemStore.kt index 459be36..1ee7541 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/models/SpotMemStore.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/models/SpotMemStore.kt @@ -28,7 +28,7 @@ class SpotMemStore : SpotStore, AnkoLogger { var foundSpot: SpotModel? = spots.find { spot_iterator -> spot_iterator.id == spot.id } if (foundSpot != null) { foundSpot.title = spot.title - foundSpot.desription = spot.desription + foundSpot.description = spot.description foundSpot.image = spot.image foundSpot.lat = spot.lat foundSpot.lng = spot.lng @@ -37,6 +37,10 @@ class SpotMemStore : SpotStore, AnkoLogger { } } + override fun delete(spot: SpotModel) { + spots.remove(spot) + } + fun logAll() { spots.forEach { info("${it}") } } diff --git a/app/src/main/java/com/archaeologicalfieldwork/models/SpotModel.kt b/app/src/main/java/com/archaeologicalfieldwork/models/SpotModel.kt index 37d5a1a..426cbe7 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/models/SpotModel.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/models/SpotModel.kt @@ -7,7 +7,7 @@ import kotlinx.android.parcel.Parcelize data class SpotModel( var id: Long = 0, var title: String = "", - var desription: String = "", + var description: String = "", var image: String = "", var lat: Double = 0.0, var lng: Double = 0.0, diff --git a/app/src/main/java/com/archaeologicalfieldwork/models/SpotStore.kt b/app/src/main/java/com/archaeologicalfieldwork/models/SpotStore.kt index 355d38f..5882214 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/models/SpotStore.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/models/SpotStore.kt @@ -4,4 +4,5 @@ interface SpotStore { fun findAll(): List fun create(spot: SpotModel) fun update(spot: SpotModel) + fun delete(spot: SpotModel) } \ No newline at end of file diff --git a/app/src/main/res/menu/menu_new_spot.xml b/app/src/main/res/menu/menu_new_spot.xml index 0f956e2..da9a8e6 100644 --- a/app/src/main/res/menu/menu_new_spot.xml +++ b/app/src/main/res/menu/menu_new_spot.xml @@ -2,6 +2,11 @@ + Add Cancel + Delete Add Spot @@ -12,10 +13,12 @@ Spot Title Spot Description Please enter a Spot Title + Add Image Select Spot image Change Image + Set Location Map From be4a704049939e094bb97267dfab36a87699361a Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 20:32:32 +0100 Subject: [PATCH 06/30] [Lab 07] 02 - Introduced Map Activity and button in Listview, start Activity on Button Click --- app/src/main/AndroidManifest.xml | 8 +++---- .../activities/SpotListActivity.kt | 2 ++ .../activities/SpotMapsActivity.kt | 16 +++++++++++++ .../main/res/layout/activity_spot_maps.xml | 24 +++++++++++++++++++ app/src/main/res/menu/menu_main.xml | 5 ++++ app/src/main/res/values/strings.xml | 4 ++++ 6 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt create mode 100644 app/src/main/res/layout/activity_spot_maps.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34611a9..714287e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,9 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + @@ -22,15 +24,13 @@ - - + android:label="@string/title_activity_map" /> \ No newline at end of file diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt index 097a456..079f7f7 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotListActivity.kt @@ -12,6 +12,7 @@ import org.jetbrains.anko.startActivityForResult import com.archaeologicalfieldwork.R import com.archaeologicalfieldwork.main.MainApp import com.archaeologicalfieldwork.models.SpotModel +import org.jetbrains.anko.startActivity class SpotListActivity : AppCompatActivity(), SpotListener, AnkoLogger { @@ -47,6 +48,7 @@ class SpotListActivity : AppCompatActivity(), SpotListener, AnkoLogger { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.item_add -> startActivityForResult(0) + R.id.item_map -> startActivity() } return super.onOptionsItemSelected(item) } diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt new file mode 100644 index 0000000..36bc85f --- /dev/null +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt @@ -0,0 +1,16 @@ +package com.archaeologicalfieldwork.activities + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.archaeologicalfieldwork.R +import kotlinx.android.synthetic.main.activity_spot_list.* + +class SpotMapsActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_spot_maps) + + setSupportActionBar(toolbar) + toolbar.title = title + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_spot_maps.xml b/app/src/main/res/layout/activity_spot_maps.xml new file mode 100644 index 0000000..83cc32f --- /dev/null +++ b/app/src/main/res/layout/activity_spot_maps.xml @@ -0,0 +1,24 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 9203c68..61ac404 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -7,4 +7,9 @@ android:icon="@android:drawable/ic_menu_add" android:title="@string/menu_addSpot" app:showAsAction="always" /> + \ 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 b2e1efe..a8daa17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,4 +23,8 @@ Set Location Map + + Show Map + Map + \ No newline at end of file From 0c05dd2633e9ff13ebd1c24aa56cefb717bdea4d Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 20:43:49 +0100 Subject: [PATCH 07/30] [Lab 07] 03 - Added Map and Cardview to MapLayout --- .../main/res/layout/activity_spot_maps.xml | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/src/main/res/layout/activity_spot_maps.xml b/app/src/main/res/layout/activity_spot_maps.xml index 83cc32f..722e223 100644 --- a/app/src/main/res/layout/activity_spot_maps.xml +++ b/app/src/main/res/layout/activity_spot_maps.xml @@ -21,4 +21,36 @@ app:titleTextColor="@color/colorPrimary" /> + + + + + + + \ No newline at end of file From dd365b8add9e36bc89d1bef2c35b72449eb1e64c Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 20:59:01 +0100 Subject: [PATCH 08/30] [Lab 07] 04 - Initialize Map in Mapview --- .../activities/SpotMapsActivity.kt | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt index 36bc85f..1d47572 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt @@ -1,16 +1,47 @@ package com.archaeologicalfieldwork.activities -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.google.android.gms.maps.GoogleMap import com.archaeologicalfieldwork.R -import kotlinx.android.synthetic.main.activity_spot_list.* + +import kotlinx.android.synthetic.main.activity_spot_maps.* + class SpotMapsActivity : AppCompatActivity() { + + lateinit var map: GoogleMap + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_spot_maps) - setSupportActionBar(toolbar) - toolbar.title = title + mapView.onCreate(savedInstanceState) + + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } + + override fun onLowMemory() { + super.onLowMemory() + mapView.onLowMemory() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) } } \ No newline at end of file From 12780a4a1b99f2be6f6958055711c72c0346d5f5 Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 21:07:09 +0100 Subject: [PATCH 09/30] [Lab 07] 05 - Show Marker for every stored Spot --- .../activities/SpotMapsActivity.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt index 1d47572..6f98a84 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt @@ -1,23 +1,46 @@ package com.archaeologicalfieldwork.activities +import android.app.Application import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.maps.GoogleMap import com.archaeologicalfieldwork.R +import com.archaeologicalfieldwork.main.MainApp +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.MarkerOptions import kotlinx.android.synthetic.main.activity_spot_maps.* class SpotMapsActivity : AppCompatActivity() { + lateinit var app: MainApp lateinit var map: GoogleMap override fun onCreate(savedInstanceState: Bundle?) { + + app = application as MainApp + super.onCreate(savedInstanceState) setContentView(R.layout.activity_spot_maps) setSupportActionBar(toolbar) mapView.onCreate(savedInstanceState) + mapView.getMapAsync { + map = it + configureMap() + } + + } + fun configureMap() { + map.uiSettings.isZoomControlsEnabled = true + app.spots.findAll().forEach { + val loc = LatLng(it.lat, it.lng) + val options = MarkerOptions().title(it.title).position(loc) + map.addMarker(options).tag = it.id + map.moveCamera(CameraUpdateFactory.newLatLngZoom(loc, it.zoom)) + } } override fun onDestroy() { From 14ccf5f70ef4a35481a5650176ff4bfe41f3b651 Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 21:29:21 +0100 Subject: [PATCH 10/30] [Lab 07] 06 - Added TitleTextView, DescriptionTextView and ImageView to CardView in MapView --- .../main/res/layout/activity_spot_maps.xml | 52 ++++++++++++++++++- app/src/main/res/values/strings.xml | 3 ++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_spot_maps.xml b/app/src/main/res/layout/activity_spot_maps.xml index 722e223..cb142b0 100644 --- a/app/src/main/res/layout/activity_spot_maps.xml +++ b/app/src/main/res/layout/activity_spot_maps.xml @@ -36,7 +36,57 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.448" - app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintStart_toStartOf="parent"> + + + + + + + + + + Show Map Map + Spot Image + Title + Description \ No newline at end of file From 46dc4dcd71e1115b494e9c52ebeb2d34df469af3 Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 21:36:24 +0100 Subject: [PATCH 11/30] [Lab 07] 07 - Added onMarkerClickListener to display Spot title in cardview --- .../activities/SpotMapsActivity.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt index 6f98a84..48e9480 100644 --- a/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt +++ b/app/src/main/java/com/archaeologicalfieldwork/activities/SpotMapsActivity.kt @@ -8,12 +8,13 @@ import com.archaeologicalfieldwork.R import com.archaeologicalfieldwork.main.MainApp import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.Marker import com.google.android.gms.maps.model.MarkerOptions import kotlinx.android.synthetic.main.activity_spot_maps.* -class SpotMapsActivity : AppCompatActivity() { +class SpotMapsActivity : AppCompatActivity(), GoogleMap.OnMarkerClickListener { lateinit var app: MainApp lateinit var map: GoogleMap @@ -35,6 +36,8 @@ class SpotMapsActivity : AppCompatActivity() { fun configureMap() { map.uiSettings.isZoomControlsEnabled = true + map.setOnMarkerClickListener(this) + app.spots.findAll().forEach { val loc = LatLng(it.lat, it.lng) val options = MarkerOptions().title(it.title).position(loc) @@ -43,6 +46,11 @@ class SpotMapsActivity : AppCompatActivity() { } } + override fun onMarkerClick(marker: Marker): Boolean { + currentTitle.text = marker.title + return false + } + override fun onDestroy() { super.onDestroy() mapView.onDestroy() From 65dcde50f4070b7516ce84451e2962c7157acbd4 Mon Sep 17 00:00:00 2001 From: Lup31519 Date: Fri, 1 Jan 2021 22:00:23 +0100 Subject: [PATCH 12/30] [Lab 07] Ex - Refactored activity_spot.xml to a ConstraintLayout with ScrollView --- app/src/main/res/layout/activity_spot.xml | 180 +++++++++++++--------- 1 file changed, 111 insertions(+), 69 deletions(-) diff --git a/app/src/main/res/layout/activity_spot.xml b/app/src/main/res/layout/activity_spot.xml index d89ae99..2f1f05a 100644 --- a/app/src/main/res/layout/activity_spot.xml +++ b/app/src/main/res/layout/activity_spot.xml @@ -6,44 +6,67 @@ android:layout_height="match_parent" tools:context="com.archaeologicalfieldwork.activities.SpotActivity"> - + android:background="@color/colorAccent" + android:fitsSystemWindows="true" + app:elevation="0dip" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> - + app:titleTextColor="@color/colorPrimary" /> + - - + - + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + android:layout_height="match_parent"> + +