From 2041b66b7cf608af86b340c5a157c044d4ca993c Mon Sep 17 00:00:00 2001 From: haidarhamda <haidarhamda23@gmail.com> Date: Thu, 4 Apr 2024 12:19:44 +0700 Subject: [PATCH] feat: transaction location --- app/build.gradle.kts | 2 + app/src/main/AndroidManifest.xml | 2 + .../EditTransactionActivity.kt | 94 ++++++++++++++++-- .../NewTransactionActivity.kt | 96 ++++++++++++++++--- .../res/layout/activity_edit_transaction.xml | 15 ++- .../res/layout/activity_new_transaction.xml | 15 ++- .../res/layout/recyclerview_transaction.xml | 22 +++-- 7 files changed, 209 insertions(+), 37 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e5d9496..26889b5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -122,6 +122,8 @@ dependencies { implementation("org.apache.poi:poi:5.2.3") implementation("org.apache.poi:poi-ooxml:5.2.3") + + implementation("com.google.android.gms:play-services-location:21.2.0") } //androidExtensions{ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6d025f9..92c32c8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,8 @@ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET"/> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application android:name=".TransactionApplication" diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/EditTransactionActivity.kt b/app/src/main/java/com/example/if3210_2024_android_aab/EditTransactionActivity.kt index ef2c21b..4076183 100644 --- a/app/src/main/java/com/example/if3210_2024_android_aab/EditTransactionActivity.kt +++ b/app/src/main/java/com/example/if3210_2024_android_aab/EditTransactionActivity.kt @@ -1,35 +1,39 @@ package com.example.if3210_2024_android_aab +import android.Manifest import android.app.Activity import android.content.Intent +import android.content.pm.PackageManager +import android.location.LocationManager +import android.location.LocationRequest import android.os.Bundle import android.text.TextUtils import android.util.Log import android.widget.EditText import android.widget.RadioButton import android.widget.RadioGroup +import android.widget.TextView import android.widget.Toast import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import com.example.if3210_2024_android_aab.ui.theme.If32102024androidaabTheme +import androidx.core.app.ActivityCompat +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices class EditTransactionActivity : ComponentActivity() { private lateinit var editJudul: EditText private lateinit var editNominal: EditText - private lateinit var editLokasi: EditText + private lateinit var editLokasi: TextView private lateinit var radioGroup: RadioGroup private lateinit var selectedRadioButton: RadioButton + private lateinit var fusedLocationClient: FusedLocationProviderClient + + private val requestcode = 2 + public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) val transactionId = intent.getIntExtra("transactionId",0) // Log.d("EditTransactionActivity", transactionId.toString()) val transactionJudul = intent.getStringExtra("transactionJudul") @@ -54,6 +58,7 @@ class EditTransactionActivity : ComponentActivity() { val saveButton = findViewById<android.widget.Button>(R.id.edit_transaction_button_save) val deleteButton = findViewById<android.widget.Button>(R.id.edit_transaction_button_delete) + val getLocationButton = findViewById<android.widget.Button>(R.id.button_get_current_location) deleteButton.setOnClickListener { val replyIntent = intent @@ -97,6 +102,75 @@ class EditTransactionActivity : ComponentActivity() { finish() } } + + getLocationButton.setOnClickListener { + getLocation() + } + } + + private fun getLocation(){ + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions( + this, + arrayOf( + android.Manifest.permission.ACCESS_FINE_LOCATION, + android.Manifest.permission.ACCESS_COARSE_LOCATION + ), + requestcode + ) + false + } + if (isLocationEnabled()){ +// fusedLocationClient.getCurrentLocation(1, null) + fusedLocationClient.getCurrentLocation(LocationRequest.QUALITY_HIGH_ACCURACY, null) + .addOnSuccessListener { + location -> + if (location == null){ + Toast.makeText(this, "Location not found", Toast.LENGTH_SHORT).show() + } else { + val geocoder = android.location.Geocoder(this) +// Toast.makeText(this, "Location is not null", Toast.LENGTH_SHORT).show() + val addresses = geocoder.getFromLocation(location.latitude, location.longitude, 1) + editLokasi.setText(addresses?.get(0)?.getAddressLine(0).toString()) + } + } + + } else { + Toast.makeText(this, "Location is disabled", Toast.LENGTH_SHORT).show() + val intent = Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS) + startActivity(intent) + } + + } + + fun isLocationEnabled():Boolean{ + val locationManager: LocationManager = getSystemService(LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER + ) + } + + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array<out String>, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == requestcode) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show() + } + } } companion object { diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/NewTransactionActivity.kt b/app/src/main/java/com/example/if3210_2024_android_aab/NewTransactionActivity.kt index 94da877..2871094 100644 --- a/app/src/main/java/com/example/if3210_2024_android_aab/NewTransactionActivity.kt +++ b/app/src/main/java/com/example/if3210_2024_android_aab/NewTransactionActivity.kt @@ -1,33 +1,33 @@ package com.example.if3210_2024_android_aab +import android.Manifest import android.app.Activity import android.content.Intent +import android.content.pm.PackageManager +import android.location.LocationManager +import android.location.LocationRequest import android.os.Bundle import android.text.TextUtils -import android.util.Log import android.widget.EditText import android.widget.RadioButton import android.widget.RadioGroup +import android.widget.TextView import android.widget.Toast -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import com.example.if3210_2024_android_aab.ui.theme.If32102024androidaabTheme +import androidx.core.app.ActivityCompat +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices class NewTransactionActivity:AppCompatActivity() { private lateinit var editJudul: EditText private lateinit var editNominal: EditText - private lateinit var editLokasi: EditText + private lateinit var editLokasi: TextView private lateinit var radioGroup: RadioGroup private lateinit var selectedRadioButton: RadioButton + private lateinit var fusedLocationClient: FusedLocationProviderClient + + private val requestcode = 2 public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -37,9 +37,10 @@ class NewTransactionActivity:AppCompatActivity() { editLokasi = findViewById(R.id.edit_lokasi) radioGroup = findViewById(R.id.kategori_radio_group) - + fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) val saveButton = findViewById<android.widget.Button>(R.id.button_save) + val getLocationButton = findViewById<android.widget.Button>(R.id.button_get_current_location) saveButton.setOnClickListener { val replyIntent = Intent() @@ -72,6 +73,75 @@ class NewTransactionActivity:AppCompatActivity() { finish() } } + + getLocationButton.setOnClickListener { + getLocation() + } + } + + private fun getLocation(){ + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions( + this, + arrayOf( + android.Manifest.permission.ACCESS_FINE_LOCATION, + android.Manifest.permission.ACCESS_COARSE_LOCATION + ), + requestcode + ) + false + } + if (isLocationEnabled()){ +// fusedLocationClient.getCurrentLocation(1, null) + fusedLocationClient.getCurrentLocation(LocationRequest.QUALITY_HIGH_ACCURACY, null) + .addOnSuccessListener { + location -> + if (location == null){ + Toast.makeText(this, "Location not found", Toast.LENGTH_SHORT).show() + } else { + val geocoder = android.location.Geocoder(this) +// Toast.makeText(this, "Location is not null", Toast.LENGTH_SHORT).show() + val addresses = geocoder.getFromLocation(location.latitude, location.longitude, 1) + editLokasi.setText(addresses?.get(0)?.getAddressLine(0).toString()) + } + } + + } else { + Toast.makeText(this, "Location is disabled", Toast.LENGTH_SHORT).show() + val intent = Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS) + startActivity(intent) + } + + } + + fun isLocationEnabled():Boolean{ + val locationManager:LocationManager = getSystemService(LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER + ) + } + + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array<out String>, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == requestcode) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show() + } + } } companion object { diff --git a/app/src/main/res/layout/activity_edit_transaction.xml b/app/src/main/res/layout/activity_edit_transaction.xml index f25eb12..2325b80 100644 --- a/app/src/main/res/layout/activity_edit_transaction.xml +++ b/app/src/main/res/layout/activity_edit_transaction.xml @@ -116,7 +116,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/edit_transaction_kategori_radio_group" /> - <EditText + <TextView android:id="@+id/edit_transaction_edit_lokasi" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -124,8 +124,6 @@ android:layout_marginTop="10dp" android:layout_marginEnd="16dp" android:ems="10" - android:inputType="text" - android:maxLength="30" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" @@ -141,5 +139,16 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> + <Button + android:id="@+id/button_get_current_location" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="20dp" + android:layout_marginTop="192dp" + android:text="Lokasi saat ini" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/edit_transaction_lokasi_label" + app:layout_constraintTop_toBottomOf="@+id/edit_transaction_edit_nominal" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_new_transaction.xml b/app/src/main/res/layout/activity_new_transaction.xml index d228fe6..a72f951 100644 --- a/app/src/main/res/layout/activity_new_transaction.xml +++ b/app/src/main/res/layout/activity_new_transaction.xml @@ -116,7 +116,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/kategori_radio_group" /> - <EditText + <TextView android:id="@+id/edit_lokasi" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -124,12 +124,21 @@ android:layout_marginTop="10dp" android:layout_marginEnd="16dp" android:ems="10" - android:inputType="text" - android:maxLength="30" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/lokasi_label" /> + <Button + android:id="@+id/button_get_current_location" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="20dp" + android:layout_marginTop="192dp" + android:text="Lokasi saat ini" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/lokasi_label" + app:layout_constraintTop_toBottomOf="@+id/edit_nominal" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/recyclerview_transaction.xml b/app/src/main/res/layout/recyclerview_transaction.xml index 375f2c0..5fb57e6 100644 --- a/app/src/main/res/layout/recyclerview_transaction.xml +++ b/app/src/main/res/layout/recyclerview_transaction.xml @@ -36,20 +36,26 @@ android:layout_marginTop="24dp" android:layout_marginEnd="17dp" android:background="#00FFFFFF" - app:layout_constraintEnd_toStartOf="@+id/location" + app:layout_constraintEnd_toStartOf="@+id/horizontalScrollView" app:layout_constraintTop_toBottomOf="@+id/isPemasukan" app:srcCompat="@drawable/baseline_add_location_24" /> - <TextView - android:id="@+id/location" - android:layout_width="wrap_content" + <HorizontalScrollView + android:id="@+id/horizontalScrollView" + android:layout_width="110dp" android:layout_height="wrap_content" android:layout_marginTop="24dp" - android:layout_marginEnd="76dp" - android:text="lokasi" - android:textSize="16sp" + android:layout_marginEnd="10dp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/isPemasukan" /> + app:layout_constraintTop_toBottomOf="@+id/isPemasukan"> + + <TextView + android:id="@+id/location" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:text="lokasi" + android:textSize="16sp" /> + </HorizontalScrollView> <LinearLayout android:id="@+id/linearLayout2" -- GitLab