diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e5d9496447d0abbd6b5ec761242a520ec15062fd..26889b5153fb1bc2b03e92ca50ea2ab65ff1f3c7 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 6d025f9641bbdd71553c9b1d5ed1e2a4763df44e..92c32c851e7018e1a783f26a8c2cced7d0e14942 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 ef2c21b82b4767f1d36fcb0c5e7b9990d7178752..4076183616b5570cc9f0b1e4749dfaf49e265de7 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 94da877da2919c818241fbcf9135e1e3065fcd3f..28710940157f78f9b44f716f8c20330441f0c388 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 f25eb12657b281752485ebcb59b864f3d3efdf42..2325b804b878e1533d4fd8ba3549fc60d56fd970 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 d228fe6b2424eca5e6fd1f1c3a4a27fa4fef373f..a72f951cffe576401d09f4ebf957b4d6dcf558b7 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 375f2c05f5bb5c8c0336b173207476e98a4e3e78..5fb57e68e87c36b6f91f854203542d196170f81c 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"