package com.example.application0210
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.location.Location
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import com.google.android.gms.location.FusedLocationProviderClient
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import org.json.JSONObject
import java.util.*
class MainActivity : AppCompatActivity() {
private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationCallback: LocationCallback
private lateinit var locationRequest: LocationRequest
private lateinit var textLocation: TextView
private lateinit var requestQueue: RequestQueue
private val serverUrl = "https://azurlane.work/wp-json/custom/v1/save_location/"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
// PrefsManagerのデータを表示します
// user_prefsはPrefsManager.ktでつけた名前です
// ログアウト時のuserNameはNULLではなく空文字になっているので、userName != null では駄目です
val sharedPreferences = getSharedPreferences("user_prefs", Context.MODE_PRIVATE)
val userId = sharedPreferences.getString("user_id", null)
val userName = sharedPreferences.getString("user_name", null)
val tvUserId = findViewById<TextView>(R.id.tvUserId)
val tvUserName = findViewById<TextView>(R.id.tvUserName)
if (userName.isNullOrEmpty()) {
tvUserId.text = userId
tvUserName.text = userName
} else {
tvUserId.text = "まだログインしているユーザーがありません"
}
// ユーザー登録ページへIntentで移動します
val btnGoToRegister = findViewById<Button>(R.id.btnGoToRegister)
btnGoToRegister.setOnClickListener {
val intent = Intent(this, RegisterActivity::class.java)
startActivity(intent)
}
// ログインページへ移動します
val btnGoToLogin = findViewById<Button>(R.id.btnGoToLogin)
btnGoToLogin.setOnClickListener {
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
}
// ログアウトしてログインページへ移動します
val btnGoToLogout = findViewById<Button>(R.id.btnGoToLogout)
btnGoToLogout.setOnClickListener {
val prefs = getSharedPreferences("user_prefs", Context.MODE_PRIVATE)
prefs.edit().remove("user_id").apply()
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
}
//
textLocation = findViewById(R.id.textLocation)
//
requestQueue = Volley.newRequestQueue(this)
// 位置情報のクライアントを取得
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
// 位置情報のリクエスト設定
locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 5000).build()
// 位置情報の更新を受け取るコールバック
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
for (location in locationResult.locations) {
updateLocationUI(location)
sendLocationToServer(location)
}
}
}
// 権限をリクエスト
requestLocationPermissions()
}
private fun requestLocationPermissions() {
val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true ||
permissions[Manifest.permission.ACCESS_COARSE_LOCATION] == true) {
startLocationUpdates()
} else {
textLocation.text = "権限がありません"
}
}
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissionLauncher.launch(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
)
} else {
startLocationUpdates()
}
}
@SuppressLint("MissingPermission")
private fun startLocationUpdates() {
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
}
private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
private fun updateLocationUI(location: Location) {
val locationText = "緯度: ${location.latitude}, 経度: ${location.longitude}"
textLocation.text = locationText
}
private fun sendLocationToServer(location: Location) {
val params = HashMap<String, String>()
// UUID.randomUUID()でランダムな値を生成します(Universary Unique Identifier)
params["device_id"] = UUID.randomUUID().toString()
params["latitude"] = location.latitude.toString()
params["longitude"] = location.longitude.toString()
val request = object : StringRequest(
Request.Method.POST, serverUrl,
Response.Listener { response ->
Log.d("ServerResponse", "成功: $response")
},
Response.ErrorListener { error ->
Log.e("ServerError", "エラー: ${error.message}")
}
) {
override fun getParams(): MutableMap<String, String> {
return params
}
}
requestQueue.add(request)
}
override fun onDestroy() {
super.onDestroy()
stopLocationUpdates()
}
}