From aa22482b4487579f0a00fd6b1399b2443442f9c2 Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:54:47 +0200 Subject: [PATCH 01/23] Preliminary Working Version of PlaceDetailsActivity --- app/build.gradle | 5 ++ app/src/main/AndroidManifest.xml | 6 ++ .../nlinterface/activities/MainActivity.kt | 9 ++- .../activities/PlaceDetailsActivity.kt | 67 +++++++++++++++++ .../viewmodels/PlaceDetailsViewModel.kt | 72 +++++++++++++++++++ .../res/layout/activity_place_details.xml | 68 ++++++++++++++++++ .../layout/fragment_autocomplete_support.xml | 14 ++++ app/src/main/res/values/strings.xml | 2 + build.gradle | 6 ++ 9 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt create mode 100644 app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt create mode 100644 app/src/main/res/layout/activity_place_details.xml create mode 100644 app/src/main/res/layout/fragment_autocomplete_support.xml diff --git a/app/build.gradle b/app/build.gradle index 02f9bb5..4619553 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,8 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-parcelize' + id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' + } android { @@ -53,4 +55,7 @@ dependencies { // GSON dependency implementation 'com.google.code.gson:gson:2.8.5' + + // Places API + implementation 'com.google.android.libraries.places:places:3.1.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34eea70..02c2b64 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,10 @@ android:theme="@style/Theme.NLInterface" tools:targetApi="31"> + + + diff --git a/app/src/main/java/com/nlinterface/activities/MainActivity.kt b/app/src/main/java/com/nlinterface/activities/MainActivity.kt index 3d2e33c..7e53fcc 100644 --- a/app/src/main/java/com/nlinterface/activities/MainActivity.kt +++ b/app/src/main/java/com/nlinterface/activities/MainActivity.kt @@ -14,6 +14,13 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.view.WindowCompat +import com.google.android.gms.common.api.ApiException +import com.google.android.gms.common.api.internal.ApiKey +import com.google.android.libraries.places.api.Places +import com.google.android.libraries.places.api.model.Place +import com.google.android.libraries.places.api.net.FetchPlaceRequest +import com.google.android.libraries.places.api.net.FetchPlaceResponse +import com.nlinterface.BuildConfig import com.nlinterface.R import com.nlinterface.databinding.ActivityMainBinding import com.nlinterface.utility.* @@ -49,7 +56,7 @@ class MainActivity : AppCompatActivity() { val navigationActivityButton: Button = findViewById(R.id.navigation_bt) as Button navigationActivityButton.setOnClickListener { view -> - val intent = Intent(view.context, NavigationActivity::class.java) + val intent = Intent(view.context, PlaceDetailsActivity::class.java) view.context.startActivity(intent) } diff --git a/app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt b/app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt new file mode 100644 index 0000000..bcaa009 --- /dev/null +++ b/app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt @@ -0,0 +1,67 @@ +package com.nlinterface.activities + +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.ImageButton +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.google.android.gms.common.api.Status +import com.google.android.libraries.places.api.model.Place +import com.google.android.libraries.places.widget.AutocompleteSupportFragment +import com.google.android.libraries.places.widget.listener.PlaceSelectionListener +import com.google.android.material.button.MaterialButton +import com.nlinterface.R +import com.nlinterface.databinding.ActivityPlaceDetailsBinding +import com.nlinterface.utility.setViewRelativeSize +import com.nlinterface.viewmodels.GroceryListViewModel +import com.nlinterface.viewmodels.PlaceDetailsViewModel + +class PlaceDetailsActivity: AppCompatActivity() { + + private lateinit var binding: ActivityPlaceDetailsBinding + private lateinit var viewModel: PlaceDetailsViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + viewModel = ViewModelProvider(this)[PlaceDetailsViewModel::class.java] + viewModel.initPlaceClient(this) + + binding = ActivityPlaceDetailsBinding.inflate(layoutInflater) + setContentView(binding.root) + + val voiceActivationButton = findViewById(R.id.voice_activation_bt) as ImageButton + setViewRelativeSize(voiceActivationButton, 1.0, 0.33) + + voiceActivationButton.setOnClickListener {} // TODO + + // Initialize the AutocompleteSupportFragment. + val autocompleteFragment = + supportFragmentManager.findFragmentById(R.id.autocomplete_fragment) + as AutocompleteSupportFragment + + // Specify the types of place data to return. + autocompleteFragment.setPlaceFields(listOf(Place.Field.ID)) + + // Set up a PlaceSelectionListener to handle the response. + autocompleteFragment.setOnPlaceSelectedListener(object : PlaceSelectionListener { + override fun onError(status: Status) { + viewModel.onError(status) + } + override fun onPlaceSelected(place: Place) { + viewModel.onPlaceSelected(place) { if (it) loadInformation() } + } + }) + } + + private fun loadInformation() { + val nameField = findViewById(R.id.place_details_name_tv) as TextView + val openingHoursField = findViewById(R.id.place_details_opening_hours_tv) as TextView + + nameField.text = viewModel.getPlaceName() + openingHoursField.text = viewModel.getPlaceOpeningHours().toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt b/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt new file mode 100644 index 0000000..4103794 --- /dev/null +++ b/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt @@ -0,0 +1,72 @@ +package com.nlinterface.viewmodels + +import android.app.Application +import android.content.Context +import android.util.Log +import androidx.lifecycle.AndroidViewModel +import com.google.android.gms.common.api.ApiException +import com.google.android.gms.common.api.Status +import com.google.android.libraries.places.api.Places +import com.google.android.libraries.places.api.model.Place +import com.google.android.libraries.places.api.net.FetchPlaceRequest +import com.google.android.libraries.places.api.net.FetchPlaceResponse +import com.google.android.libraries.places.api.net.PlacesClient +import com.nlinterface.BuildConfig +import com.nlinterface.dataclasses.PlaceItem +import kotlinx.coroutines.CompletionHandler + +class PlaceDetailsViewModel(application: Application) : AndroidViewModel(application) { + + private val context = application + private lateinit var placesClient: PlacesClient + private lateinit var place: Place + + fun initPlaceClient(context: Context) { + Places.initialize(context, BuildConfig.MAPS_API_KEY) + placesClient = Places.createClient(context) + } + + fun onPlaceSelected(place: Place, completion: (success: Boolean) -> Unit) { + val placeID = place.id + fetchPlaceDetails(placeID) { + completion(it) + } + } + + private fun fetchPlaceDetails(placeID: String?, completion: (success: Boolean) -> Unit) { + + // Specify the fields to return. + val placeFields = listOf( + Place.Field.NAME, Place.Field.OPENING_HOURS, Place.Field.ADDRESS + ) + + // Construct a request object, passing the place ID and fields array. + val request = placeID?.let { FetchPlaceRequest.newInstance(it, placeFields) } + + if (request != null) { + placesClient.fetchPlace(request) + .addOnSuccessListener { response: FetchPlaceResponse -> + place = response.place + completion(true) + }.addOnFailureListener { exception: Exception -> + if (exception is ApiException) { + Log.println(Log.DEBUG, "MAPSAPI", "failed") + } + completion(false) + } + } + } + + fun getPlaceName(): String { + return place.name.toString() + } + + fun getPlaceOpeningHours(): MutableList { + return place.openingHours.weekdayText + } + + fun onError(status: Status) { + // TODO + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_place_details.xml b/app/src/main/res/layout/activity_place_details.xml new file mode 100644 index 0000000..67b3a41 --- /dev/null +++ b/app/src/main/res/layout/activity_place_details.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_autocomplete_support.xml b/app/src/main/res/layout/fragment_autocomplete_support.xml new file mode 100644 index 0000000..10eae0c --- /dev/null +++ b/app/src/main/res/layout/fragment_autocomplete_support.xml @@ -0,0 +1,14 @@ + + + + + + + \ 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 5f6780e..0ea4f73 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,4 +14,6 @@ ... Tap to speak Recognized speech will be written here + + Hello blank fragment \ No newline at end of file diff --git a/build.gradle b/build.gradle index c518bc1..da56258 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,10 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + dependencies { + classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1" + } +} + plugins { id 'com.android.application' version '7.3.0' apply false id 'com.android.library' version '7.3.0' apply false From 5948263f164631c17bac8be2f4d8ca85fc28c6d8 Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:57:15 +0200 Subject: [PATCH 02/23] Fixed faulty import --- .../java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt b/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt index 4103794..690310c 100644 --- a/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt +++ b/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt @@ -12,7 +12,6 @@ import com.google.android.libraries.places.api.net.FetchPlaceRequest import com.google.android.libraries.places.api.net.FetchPlaceResponse import com.google.android.libraries.places.api.net.PlacesClient import com.nlinterface.BuildConfig -import com.nlinterface.dataclasses.PlaceItem import kotlinx.coroutines.CompletionHandler class PlaceDetailsViewModel(application: Application) : AndroidViewModel(application) { From 74685a258229331db2db11483d09b7b11ccd9bea Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:24:04 +0200 Subject: [PATCH 03/23] GroceryList: new functionalities - LongClick to Place in Cart - Swipe to Delete --- .../activities/GroceryListActivity.kt | 50 +++++++++++++++++-- .../adapters/GroceryListAdapter.kt | 22 ++++++-- .../viewmodels/GroceryListViewModel.kt | 4 ++ .../main/res/layout/activity_grocery_list.xml | 5 +- app/src/main/res/layout/grocery_item.xml | 3 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 3 +- 7 files changed, 77 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nlinterface/activities/GroceryListActivity.kt b/app/src/main/java/com/nlinterface/activities/GroceryListActivity.kt index a65f33d..cd45d20 100644 --- a/app/src/main/java/com/nlinterface/activities/GroceryListActivity.kt +++ b/app/src/main/java/com/nlinterface/activities/GroceryListActivity.kt @@ -11,6 +11,7 @@ import android.widget.ImageButton import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.nlinterface.R @@ -20,6 +21,7 @@ import com.nlinterface.dataclasses.GroceryItem import com.nlinterface.interfaces.GroceryListCallback import com.nlinterface.utility.setViewRelativeHeight import com.nlinterface.utility.setViewRelativeSize +import com.nlinterface.utility.setViewRelativeWidth import com.nlinterface.viewmodels.GroceryListViewModel @@ -61,6 +63,48 @@ class GroceryListActivity : AppCompatActivity(), GroceryListCallback { voiceActivationButton.setOnClickListener { onAddVoiceActivationButtonClick() } + + ItemTouchHelper(object : ItemTouchHelper.SimpleCallback( + 0, ItemTouchHelper.LEFT + ) { + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean {return false} + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val groceryItem: GroceryItem = + groceryItemList[viewHolder.adapterPosition] + + val index = viewHolder.adapterPosition + + viewModel.deleteGroceryItem(groceryItem) + + adapter.notifyItemRemoved(index) + } + }).attachToRecyclerView(rvGroceryList) + + ItemTouchHelper(object : ItemTouchHelper.SimpleCallback( + 0, ItemTouchHelper.RIGHT + ) { + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean {return false} + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val groceryItem: GroceryItem = + groceryItemList[viewHolder.adapterPosition] + + val index = viewHolder.adapterPosition + + viewModel.deleteGroceryItem(groceryItem) + + adapter.notifyItemRemoved(index) + } + }).attachToRecyclerView(rvGroceryList) } override fun onDestroy() { @@ -97,11 +141,11 @@ class GroceryListActivity : AppCompatActivity(), GroceryListCallback { } alertDialog?.show() } - + override fun onLongClick(item: GroceryItem) { val index = groceryItemList.indexOf(item) - viewModel.deleteGroceryItem(item) - adapter?.notifyItemRemoved(index) + viewModel.placeGroceryItemInCart(item) + adapter.notifyItemChanged(index) } } \ No newline at end of file diff --git a/app/src/main/java/com/nlinterface/adapters/GroceryListAdapter.kt b/app/src/main/java/com/nlinterface/adapters/GroceryListAdapter.kt index 510fd86..1acfbcf 100644 --- a/app/src/main/java/com/nlinterface/adapters/GroceryListAdapter.kt +++ b/app/src/main/java/com/nlinterface/adapters/GroceryListAdapter.kt @@ -1,9 +1,13 @@ package com.nlinterface.adapters +import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.cardview.widget.CardView +import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.nlinterface.R import com.nlinterface.dataclasses.GroceryItem @@ -16,7 +20,8 @@ class GroceryListAdapter( class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) { - val groceryItemView: TextView = itemView.findViewById(R.id.grocery_item_tv) + val groceryItemTextView: TextView = itemView.findViewById(R.id.grocery_item_tv) + val groceryItemCardView: CardView = itemView.findViewById(R.id.grocery_item_cv) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -31,10 +36,21 @@ class GroceryListAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val groceryItem: GroceryItem = data[position] // Set item views based on your views and data model - val textView = holder.groceryItemView + val textView = holder.groceryItemTextView + val cardView = holder.groceryItemCardView + val res = holder.itemView.resources textView.text = groceryItem.itemName - textView.setOnLongClickListener { + if (groceryItem.inCart) { + cardView.background.setTint(ContextCompat.getColor(holder.itemView.context, R.color.grey)) + } else { + cardView.background.setTint(ContextCompat.getColor(holder.itemView.context, R.color.black)) + } + + textView.layoutParams.width = LayoutParams.WRAP_CONTENT + cardView.layoutParams.width = LayoutParams.WRAP_CONTENT + + cardView.setOnLongClickListener { groceryListCallback.onLongClick(data[position]) true } diff --git a/app/src/main/java/com/nlinterface/viewmodels/GroceryListViewModel.kt b/app/src/main/java/com/nlinterface/viewmodels/GroceryListViewModel.kt index f565865..72936d3 100644 --- a/app/src/main/java/com/nlinterface/viewmodels/GroceryListViewModel.kt +++ b/app/src/main/java/com/nlinterface/viewmodels/GroceryListViewModel.kt @@ -47,6 +47,10 @@ class GroceryListViewModel ( groceryList.remove(groceryItem) } + fun placeGroceryItemInCart(groceryItem: GroceryItem) { + groceryItem.inCart = !groceryItem.inCart + } + fun storeGroceryList() { val jsonString : String = gson.toJson(groceryList) groceryListFile.writeText(jsonString) diff --git a/app/src/main/res/layout/activity_grocery_list.xml b/app/src/main/res/layout/activity_grocery_list.xml index 66ee25f..9b831bc 100644 --- a/app/src/main/res/layout/activity_grocery_list.xml +++ b/app/src/main/res/layout/activity_grocery_list.xml @@ -30,12 +30,13 @@ android:insetBottom="0dp" android:insetTop="0dp" android:textSize="35dp" - android:text="@string/add_item" + android:text="@string/add" app:cornerRadius="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="1" /> + app:layout_constraintVertical_bias="1" + app:layout_constraintHorizontal_bias="1"/> \ No newline at end of file diff --git a/app/src/main/res/layout/grocery_item.xml b/app/src/main/res/layout/grocery_item.xml index f6165c0..8aef91c 100644 --- a/app/src/main/res/layout/grocery_item.xml +++ b/app/src/main/res/layout/grocery_item.xml @@ -7,11 +7,12 @@ xmlns:card_view="http://schemas.android.com/apk/res-auto"> #FFFFFFFF #FF0000 #00FF00 + #bcbcbc \ 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 0ea4f73..66128ff 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,5 @@ ... Tap to speak Recognized speech will be written here - - Hello blank fragment + \ No newline at end of file From 72a671cab5acf705710496120cf4422394194ca8 Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Thu, 21 Sep 2023 13:22:04 +0200 Subject: [PATCH 04/23] MainActivity: Added Settings Button resized buttons, enabled Activity switching to settings --- app/build.gradle | 2 +- .../nlinterface/activities/MainActivity.kt | 13 ++------ app/src/main/res/layout/activity_main.xml | 33 ++++++++++++++----- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4619553..08e36af 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,5 +57,5 @@ dependencies { implementation 'com.google.code.gson:gson:2.8.5' // Places API - implementation 'com.google.android.libraries.places:places:3.1.0' + implementation 'com.google.android.libraries.places:places:3.2.0' } \ No newline at end of file diff --git a/app/src/main/java/com/nlinterface/activities/MainActivity.kt b/app/src/main/java/com/nlinterface/activities/MainActivity.kt index 8bc545a..fa22f59 100644 --- a/app/src/main/java/com/nlinterface/activities/MainActivity.kt +++ b/app/src/main/java/com/nlinterface/activities/MainActivity.kt @@ -13,14 +13,6 @@ import android.widget.ImageButton import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat -import androidx.core.view.WindowCompat -import com.google.android.gms.common.api.ApiException -import com.google.android.gms.common.api.internal.ApiKey -import com.google.android.libraries.places.api.Places -import com.google.android.libraries.places.api.model.Place -import com.google.android.libraries.places.api.net.FetchPlaceRequest -import com.google.android.libraries.places.api.net.FetchPlaceResponse -import com.nlinterface.BuildConfig import com.nlinterface.R import com.nlinterface.databinding.ActivityMainBinding import com.nlinterface.utility.* @@ -71,12 +63,11 @@ class MainActivity : AppCompatActivity() { onAddVoiceActivationButtonClick() } - //TODO: main activity layout needs to be adjusted to show more buttons - /*val settingsActivityButton: Button = findViewById(R.id.settings_bt) as Button + val settingsActivityButton: Button = findViewById(R.id.settings_bt) as Button settingsActivityButton.setOnClickListener { view -> val intent = Intent(view.context, SettingsActivity::class.java) view.context.startActivity(intent) - }*/ + } verifyAudioPermissions() } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index dc20b1e..00c2370 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -12,21 +12,21 @@ + app:layout_constraintVertical_bias="1.0"> + + From adbe257734719b4870c1547a5c4f370c5bbec4d9 Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Thu, 21 Sep 2023 13:47:04 +0200 Subject: [PATCH 05/23] adaptive text sizes --- .../nlinterface/activities/MainActivity.kt | 4 +-- app/src/main/res/layout/activity_main.xml | 25 ++++++++++++++----- app/src/main/res/layout/grocery_item.xml | 9 +++++-- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nlinterface/activities/MainActivity.kt b/app/src/main/java/com/nlinterface/activities/MainActivity.kt index fa22f59..1829b8f 100644 --- a/app/src/main/java/com/nlinterface/activities/MainActivity.kt +++ b/app/src/main/java/com/nlinterface/activities/MainActivity.kt @@ -44,8 +44,8 @@ class MainActivity : AppCompatActivity() { view.context.startActivity(intent) } - val navigationActivityButton: Button = findViewById(R.id.navigation_bt) as Button - navigationActivityButton.setOnClickListener { view -> + val placeDetailsButton: Button = findViewById(R.id.place_details_bt) as Button + placeDetailsButton.setOnClickListener { view -> val intent = Intent(view.context, PlaceDetailsActivity::class.java) view.context.startActivity(intent) } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00c2370..3e61182 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,7 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + tools:ignore="NamespaceTypo"> + android:textSize="35sp" + android:gravity="center" + app:autoSizeTextType="uniform" + app:autoSizeMinTextSize="12sp" + app:autoSizeMaxTextSize="100sp" + app:autoSizeStepGranularity="2sp"/> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2ebf23d..3d533be 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -4,6 +4,7 @@ Einkaufsliste Navigation Ortung + Ort Details Artikel hinzufügen Hinzufügen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9c04c0b..1784da9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ Motor Module Navigation Location + Place Details Add Item Add Cancel From 2375f5e967c74d3f455f4ea70388c62ffbe4c2f0 Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Sat, 14 Oct 2023 21:15:04 +0200 Subject: [PATCH 06/23] Implemented Recyclerview for Place Details - Displays list of recent store search results with store name, today's opening hours and possibility to mark favorites TODO: - sort according to recent searches/favorites - check if opening times correct - display whether currently open or not - delete (manually and after a certain duration) - request more info on store (address, etc.) --- .../activities/PlaceDetailsActivity.kt | 34 ++++++-- .../adapters/PlaceDetailsAdapter.kt | 69 +++++++++++++++++ .../dataclasses/PlaceDetailsItem.kt | 17 ++++ .../interfaces/PlaceDetailsItemCallback.kt | 6 ++ .../viewmodels/PlaceDetailsViewModel.kt | 51 ++++++++++-- .../main/res/drawable/ic_baseline_star_24.xml | 5 ++ .../drawable/ic_baseline_star_border_24.xml | 5 ++ .../res/layout/activity_place_details.xml | 77 +++++++++++-------- app/src/main/res/layout/place_detail_item.xml | 70 +++++++++++++++++ 9 files changed, 288 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt create mode 100644 app/src/main/java/com/nlinterface/dataclasses/PlaceDetailsItem.kt create mode 100644 app/src/main/java/com/nlinterface/interfaces/PlaceDetailsItemCallback.kt create mode 100644 app/src/main/res/drawable/ic_baseline_star_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_star_border_24.xml create mode 100644 app/src/main/res/layout/place_detail_item.xml diff --git a/app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt b/app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt index bcaa009..a1816f4 100644 --- a/app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt +++ b/app/src/main/java/com/nlinterface/activities/PlaceDetailsActivity.kt @@ -8,31 +8,47 @@ import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.google.android.gms.common.api.Status import com.google.android.libraries.places.api.model.Place import com.google.android.libraries.places.widget.AutocompleteSupportFragment import com.google.android.libraries.places.widget.listener.PlaceSelectionListener import com.google.android.material.button.MaterialButton import com.nlinterface.R +import com.nlinterface.adapters.GroceryListAdapter +import com.nlinterface.adapters.PlaceDetailsAdapter import com.nlinterface.databinding.ActivityPlaceDetailsBinding +import com.nlinterface.dataclasses.PlaceDetailsItem +import com.nlinterface.interfaces.PlaceDetailsItemCallback import com.nlinterface.utility.setViewRelativeSize import com.nlinterface.viewmodels.GroceryListViewModel import com.nlinterface.viewmodels.PlaceDetailsViewModel -class PlaceDetailsActivity: AppCompatActivity() { +class PlaceDetailsActivity: AppCompatActivity(), PlaceDetailsItemCallback { private lateinit var binding: ActivityPlaceDetailsBinding private lateinit var viewModel: PlaceDetailsViewModel + private lateinit var placeDetailsItemList: ArrayList + private lateinit var adapter: PlaceDetailsAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this)[PlaceDetailsViewModel::class.java] viewModel.initPlaceClient(this) + viewModel.fetchPlaceDetailsItemList() binding = ActivityPlaceDetailsBinding.inflate(layoutInflater) setContentView(binding.root) + val rvPlaceDetails = findViewById(R.id.place_details_rv) as RecyclerView + placeDetailsItemList = viewModel.placeDetailsItemList + + adapter = PlaceDetailsAdapter(placeDetailsItemList, this) + rvPlaceDetails.adapter = adapter + rvPlaceDetails.layoutManager = LinearLayoutManager(this) + val voiceActivationButton = findViewById(R.id.voice_activation_bt) as ImageButton setViewRelativeSize(voiceActivationButton, 1.0, 0.33) @@ -45,6 +61,7 @@ class PlaceDetailsActivity: AppCompatActivity() { // Specify the types of place data to return. autocompleteFragment.setPlaceFields(listOf(Place.Field.ID)) + autocompleteFragment.setTypesFilter(listOf("supermarket")) // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(object : PlaceSelectionListener { @@ -58,10 +75,17 @@ class PlaceDetailsActivity: AppCompatActivity() { } private fun loadInformation() { - val nameField = findViewById(R.id.place_details_name_tv) as TextView - val openingHoursField = findViewById(R.id.place_details_opening_hours_tv) as TextView + adapter.notifyItemInserted(placeDetailsItemList.size - 1) + } + + override fun onDestroy() { + super.onDestroy() + viewModel.storePlaceDetailsItemList() + } - nameField.text = viewModel.getPlaceName() - openingHoursField.text = viewModel.getPlaceOpeningHours().toString() + override fun onClick(item: PlaceDetailsItem) { + val index = placeDetailsItemList.indexOf(item) + viewModel.changeFavorite(item) + adapter.notifyItemChanged(index) } } \ No newline at end of file diff --git a/app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt b/app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt new file mode 100644 index 0000000..37d5a44 --- /dev/null +++ b/app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt @@ -0,0 +1,69 @@ +package com.nlinterface.adapters + +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.nlinterface.R +import com.nlinterface.dataclasses.PlaceDetailsItem +import com.nlinterface.interfaces.PlaceDetailsItemCallback +import com.nlinterface.utility.setViewRelativeSize +import com.nlinterface.utility.setViewRelativeWidth +import java.text.SimpleDateFormat +import java.time.LocalDateTime +import java.util.Calendar + +class PlaceDetailsAdapter ( + private val data: ArrayList, + private val placeDetailsItemCallback: PlaceDetailsItemCallback +) : RecyclerView.Adapter() { + + class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) { + + val placeDetailsItemStoreNameTextView: TextView = itemView.findViewById(R.id.place_details_store_name_tv) + val placeDetailsItemOpeningHoursTextView: TextView = itemView.findViewById(R.id.place_details_opening_hours_tv) + val placeDetailsItemFavoriteImageView: ImageView = itemView.findViewById(R.id.place_details_favorite_iv) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val context = parent.context + val inflater = LayoutInflater.from(context) + val placeDetailsView = inflater.inflate(R.layout.place_detail_item, parent, false) + + return ViewHolder(placeDetailsView) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val placeDetailsItem: PlaceDetailsItem = data[position] + + val storeNameTextView = holder.placeDetailsItemStoreNameTextView + val openingHoursTextView = holder.placeDetailsItemOpeningHoursTextView + val favoriteImageView = holder.placeDetailsItemFavoriteImageView + + val res = holder.itemView.resources + + storeNameTextView.text = placeDetailsItem.storeName + + val dayOfWeek = (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 2) % 7 + val regex = "\\ .+\\ ".toRegex() + val openingHoursText = regex.find(placeDetailsItem.openingHours[dayOfWeek])?.value + openingHoursTextView.text = openingHoursText + + if (placeDetailsItem.favorite) { + favoriteImageView.setImageResource(R.drawable.ic_baseline_star_24) + } + + favoriteImageView.setOnClickListener { + placeDetailsItemCallback.onClick(data[position]) + true + } + } + + override fun getItemCount(): Int { + return data.size + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/nlinterface/dataclasses/PlaceDetailsItem.kt b/app/src/main/java/com/nlinterface/dataclasses/PlaceDetailsItem.kt new file mode 100644 index 0000000..ae1d3a3 --- /dev/null +++ b/app/src/main/java/com/nlinterface/dataclasses/PlaceDetailsItem.kt @@ -0,0 +1,17 @@ +package com.nlinterface.dataclasses + +import android.os.Parcelable +import com.google.android.libraries.places.api.model.OpeningHours +import kotlinx.parcelize.Parcelize + +@Parcelize +data class PlaceDetailsItem( + + val placeID: String, + val storeName: String, + val openingHours: List, + var favorite: Boolean + +): Parcelable { + +} \ No newline at end of file diff --git a/app/src/main/java/com/nlinterface/interfaces/PlaceDetailsItemCallback.kt b/app/src/main/java/com/nlinterface/interfaces/PlaceDetailsItemCallback.kt new file mode 100644 index 0000000..c4e70d8 --- /dev/null +++ b/app/src/main/java/com/nlinterface/interfaces/PlaceDetailsItemCallback.kt @@ -0,0 +1,6 @@ +package com.nlinterface.interfaces +import com.nlinterface.dataclasses.PlaceDetailsItem + +interface PlaceDetailsItemCallback { + fun onClick(item: PlaceDetailsItem) +} \ No newline at end of file diff --git a/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt b/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt index 690310c..35d33ef 100644 --- a/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt +++ b/app/src/main/java/com/nlinterface/viewmodels/PlaceDetailsViewModel.kt @@ -7,18 +7,52 @@ import androidx.lifecycle.AndroidViewModel import com.google.android.gms.common.api.ApiException import com.google.android.gms.common.api.Status import com.google.android.libraries.places.api.Places +import com.google.android.libraries.places.api.model.OpeningHours import com.google.android.libraries.places.api.model.Place import com.google.android.libraries.places.api.net.FetchPlaceRequest import com.google.android.libraries.places.api.net.FetchPlaceResponse import com.google.android.libraries.places.api.net.PlacesClient +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.nlinterface.BuildConfig +import com.nlinterface.dataclasses.GroceryItem +import com.nlinterface.dataclasses.PlaceDetailsItem import kotlinx.coroutines.CompletionHandler +import java.io.BufferedReader +import java.io.File class PlaceDetailsViewModel(application: Application) : AndroidViewModel(application) { private val context = application private lateinit var placesClient: PlacesClient - private lateinit var place: Place + + private val placeDetailsItemListFileName = "PlaceDetailsItemList.json" + private val placeDetailsItemListFile: File = File(context.filesDir, placeDetailsItemListFileName) + var placeDetailsItemList: ArrayList = ArrayList () + var gson = Gson() + + fun fetchPlaceDetailsItemList() { + + if (!placeDetailsItemListFile.exists()) { + placeDetailsItemListFile.createNewFile() + } + + if (placeDetailsItemListFile.length() > 0) { + val bufferedReader: BufferedReader = placeDetailsItemListFile.bufferedReader() + val inputString = bufferedReader.use { it.readText() } + placeDetailsItemList = gson.fromJson( + inputString, + object : TypeToken?>() {}.type + ) as ArrayList + } + + Log.println(Log.DEBUG, "1", placeDetailsItemList.toString()) + } + + private fun addPlaceDetailsItem(placeID: String, storeName: String, openingHours: List): ArrayList { + placeDetailsItemList.add(PlaceDetailsItem(placeID, storeName, openingHours, favorite = false)) + return placeDetailsItemList + } fun initPlaceClient(context: Context) { Places.initialize(context, BuildConfig.MAPS_API_KEY) @@ -45,7 +79,7 @@ class PlaceDetailsViewModel(application: Application) : AndroidViewModel(applica if (request != null) { placesClient.fetchPlace(request) .addOnSuccessListener { response: FetchPlaceResponse -> - place = response.place + addPlaceDetailsItem(placeID, response.place.name, response.place.openingHours.weekdayText) completion(true) }.addOnFailureListener { exception: Exception -> if (exception is ApiException) { @@ -56,16 +90,17 @@ class PlaceDetailsViewModel(application: Application) : AndroidViewModel(applica } } - fun getPlaceName(): String { - return place.name.toString() + fun onError(status: Status) { + // TODO } - fun getPlaceOpeningHours(): MutableList { - return place.openingHours.weekdayText + fun storePlaceDetailsItemList() { + val jsonString : String = gson.toJson(placeDetailsItemList) + placeDetailsItemListFile.writeText(jsonString) } - fun onError(status: Status) { - // TODO + fun changeFavorite(item: PlaceDetailsItem) { + item.favorite = !item.favorite } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_star_24.xml b/app/src/main/res/drawable/ic_baseline_star_24.xml new file mode 100644 index 0000000..09a5c51 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_star_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_star_border_24.xml b/app/src/main/res/drawable/ic_baseline_star_border_24.xml new file mode 100644 index 0000000..26107f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_star_border_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_place_details.xml b/app/src/main/res/layout/activity_place_details.xml index 67b3a41..7e83ac1 100644 --- a/app/src/main/res/layout/activity_place_details.xml +++ b/app/src/main/res/layout/activity_place_details.xml @@ -21,48 +21,59 @@ app:layout_constraintVertical_bias="0.0" tools:layout="@layout/places_autocomplete_fragment" /> - + app:layout_constraintTop_toBottomOf="@+id/autocomplete_fragment" + app:layout_constraintVertical_bias="0.0" /> - - + - + \ No newline at end of file diff --git a/app/src/main/res/layout/place_detail_item.xml b/app/src/main/res/layout/place_detail_item.xml new file mode 100644 index 0000000..8dc424f --- /dev/null +++ b/app/src/main/res/layout/place_detail_item.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3f789210f209926819c0253e380935725168d12a Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:59:51 +0200 Subject: [PATCH 07/23] Made Layout of MainActivity relative to Display Size --- app/src/main/res/layout/activity_main.xml | 176 +++++++++++++--------- 1 file changed, 107 insertions(+), 69 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3e61182..ca4d855 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,79 +10,117 @@ android:id="@+id/voice_activation_lo" layout="@layout/voice_activation_button" /> - + android:backgroundTint="@color/black" + android:paddingVertical="10dp" + android:text="@string/grocery_list" + android:textSize="45sp" + app:autoSizeTextType="uniform" + app:autoSizeMinTextSize="12sp" + app:autoSizeMaxTextSize="100sp" + app:autoSizeStepGranularity="2sp" + app:cornerRadius="13dp" + app:layout_constraintEnd_toEndOf="@id/v_guide2" + app:layout_constraintStart_toStartOf="@id/v_guide1" + app:layout_constraintTop_toTopOf="@id/h_guide1" + app:layout_constraintBottom_toBottomOf="@id/h_guide2" + app:strokeWidth="0dp" /> - + + + + + + + + + + + + + - + - + - + \ No newline at end of file From e0caade1e653f46467c0b153f58fc30d5598b345 Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:00:22 +0200 Subject: [PATCH 08/23] Made Layout of GroceryListActivity relative to Display size --- .../main/res/layout/activity_grocery_list.xml | 21 +++++++-- app/src/main/res/layout/grocery_item.xml | 45 ++++++++++++------- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/layout/activity_grocery_list.xml b/app/src/main/res/layout/activity_grocery_list.xml index 9b831bc..c24d7e9 100644 --- a/app/src/main/res/layout/activity_grocery_list.xml +++ b/app/src/main/res/layout/activity_grocery_list.xml @@ -12,14 +12,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/grocery_item.xml b/app/src/main/res/layout/grocery_item.xml index 5f586d6..924062f 100644 --- a/app/src/main/res/layout/grocery_item.xml +++ b/app/src/main/res/layout/grocery_item.xml @@ -1,40 +1,53 @@ + android:layout_height="wrap_content"> + app:layout_constraintTop_toTopOf="@id/h_guide1" + app:strokeWidth="0dp" + card_view:cardCornerRadius="13dp"> + + + + + From 998bc631659fe5eb2a5aa26298f641adca12ff3b Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:00:58 +0200 Subject: [PATCH 09/23] Made layout of PlaceDetailsActivity relative to display size --- .../res/layout/activity_place_details.xml | 48 +------------------ app/src/main/res/layout/place_detail_item.xml | 47 ++++++++++++++---- 2 files changed, 38 insertions(+), 57 deletions(-) diff --git a/app/src/main/res/layout/activity_place_details.xml b/app/src/main/res/layout/activity_place_details.xml index 7e83ac1..ebf7188 100644 --- a/app/src/main/res/layout/activity_place_details.xml +++ b/app/src/main/res/layout/activity_place_details.xml @@ -28,52 +28,6 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/autocomplete_fragment" - app:layout_constraintVertical_bias="0.0" /> - - - - - - + app:layout_constraintTop_toBottomOf="@+id/autocomplete_fragment" /> \ No newline at end of file diff --git a/app/src/main/res/layout/place_detail_item.xml b/app/src/main/res/layout/place_detail_item.xml index 8dc424f..e0fac68 100644 --- a/app/src/main/res/layout/place_detail_item.xml +++ b/app/src/main/res/layout/place_detail_item.xml @@ -4,19 +4,17 @@ xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginHorizontal="10dp"> + android:layout_height="wrap_content"> @@ -24,7 +22,7 @@ android:id="@+id/cv" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="30dp"> + android:padding="20dp"> + app:layout_constraintStart_toEndOf="@id/guideline4" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.5" /> + + + + + + + \ No newline at end of file From f8855786d5f4d7fae4d7351dcbb77b65c19b6281 Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:01:33 +0200 Subject: [PATCH 10/23] Fixed Bug language specific opening hours --- .../com/nlinterface/adapters/PlaceDetailsAdapter.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt b/app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt index 37d5a44..d412f53 100644 --- a/app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt +++ b/app/src/main/java/com/nlinterface/adapters/PlaceDetailsAdapter.kt @@ -41,15 +41,21 @@ class PlaceDetailsAdapter ( val storeNameTextView = holder.placeDetailsItemStoreNameTextView val openingHoursTextView = holder.placeDetailsItemOpeningHoursTextView + + Log.println(Log.DEBUG, "openinghours", placeDetailsItem.openingHours.toString()) val favoriteImageView = holder.placeDetailsItemFavoriteImageView val res = holder.itemView.resources storeNameTextView.text = placeDetailsItem.storeName - val dayOfWeek = (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 2) % 7 - val regex = "\\ .+\\ ".toRegex() + val dayOfWeek = Math.floorMod(Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 2, 7) + + val regex = "(?<=: \\[?)(\\w:?–? ?ö?)+( ?–?\\d?:?)+".toRegex() + //val regex = "(?<=:\\s\\[)[\\d:– ]*(?=.*\\])|(?<=:\\s)[^\\[\\n]*".toRegex() + Log.println(Log.DEBUG, "regex", regex.toString()) val openingHoursText = regex.find(placeDetailsItem.openingHours[dayOfWeek])?.value + Log.println(Log.DEBUG, "openinghourstext", openingHoursText.toString()) openingHoursTextView.text = openingHoursText if (placeDetailsItem.favorite) { @@ -58,8 +64,8 @@ class PlaceDetailsAdapter ( favoriteImageView.setOnClickListener { placeDetailsItemCallback.onClick(data[position]) - true } + } override fun getItemCount(): Int { From f29d16b499e052ebe719acd92fe364b2d0e3c03c Mon Sep 17 00:00:00 2001 From: laramcd <61915160+laramcd@users.noreply.github.com> Date: Sun, 15 Oct 2023 19:43:42 +0200 Subject: [PATCH 11/23] Reworked SettingsActivity Layout and made adaptable to all display sizes --- .../activities/SettingsActivity.kt | 6 +- app/src/main/res/layout/activity_settings.xml | 113 ++++++++++++------ app/src/main/res/values-de/strings.xml | 12 +- app/src/main/res/values/strings.xml | 12 +- 4 files changed, 96 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/nlinterface/activities/SettingsActivity.kt b/app/src/main/java/com/nlinterface/activities/SettingsActivity.kt index a6d2fb7..4f5851e 100644 --- a/app/src/main/java/com/nlinterface/activities/SettingsActivity.kt +++ b/app/src/main/java/com/nlinterface/activities/SettingsActivity.kt @@ -3,14 +3,17 @@ package com.nlinterface.activities import android.content.Context import android.os.Bundle import android.provider.Settings.Global +import android.view.View import android.view.WindowManager import android.widget.Button +import android.widget.ImageButton import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.nlinterface.R import com.nlinterface.databinding.ActivitySettingsBinding import com.nlinterface.utility.GlobalParameters +import com.nlinterface.utility.setViewRelativeSize class SettingsActivity : AppCompatActivity() { @@ -49,7 +52,8 @@ class SettingsActivity : AppCompatActivity() { window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } - header = findViewById(R.id.header) + val voiceActivationButton = findViewById(R.id.voice_activation_bt) as ImageButton + setViewRelativeSize(voiceActivationButton, 1.0, 0.33) /*impairmentOptions = mutableListOf() resources.getStringArray(R.array.impairment_options).forEach { option -> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 4715038..efc80df 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -5,45 +5,86 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - -