ipdan4ik

[lb7] MainActivity.kt

Apr 16th, 2021 (edited)
286
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.example.lb7
  2.  
  3. import android.Manifest
  4. import android.annotation.SuppressLint
  5. import android.app.Activity
  6. import android.content.ContentValues
  7. import android.content.Intent
  8. import android.content.pm.PackageManager
  9. import android.database.sqlite.SQLiteDatabase
  10. import android.location.Location
  11. import android.location.LocationListener
  12. import android.location.LocationManager
  13. import androidx.appcompat.app.AppCompatActivity
  14. import android.os.Bundle
  15. import android.provider.Settings
  16. import android.util.Log
  17. import android.view.View
  18. import android.widget.*
  19. import androidx.core.app.ActivityCompat
  20. import androidx.core.content.ContextCompat
  21. import com.google.android.material.floatingactionbutton.FloatingActionButton
  22. import com.google.android.material.snackbar.Snackbar
  23. import org.w3c.dom.Text
  24. import kotlin.math.*
  25.  
  26. class MainActivity : AppCompatActivity() {
  27.     private var locationManager: LocationManager? = null
  28.     var items = ArrayList<Item>(0)
  29.     private lateinit var con: SQLiteDatabase;
  30.     private val MY_PERMISSIONS_REQUEST_LOCATION = 1
  31.  
  32.     private val locationListener: LocationListener = object : LocationListener {
  33.         override fun onLocationChanged(location: Location) {
  34.             showInfo(location)
  35.             checkLocation(location)
  36.         }
  37.         override fun onProviderDisabled(provider: String) { showInfo() }
  38.         override fun onProviderEnabled(provider: String) { showInfo() }
  39.         override fun onStatusChanged(provider: String, status: Int,
  40.                                      extras: Bundle) { showInfo() }
  41.     }
  42.  
  43.  
  44.     override fun onCreate(savedInstanceState: Bundle?) {
  45.         super.onCreate(savedInstanceState)
  46.         setContentView(R.layout.activity_main)
  47.         locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
  48.  
  49.         val db = SQLiteHelper(this);
  50.         con = db.readableDatabase
  51.         getItems()
  52.  
  53.         val listView: ListView = findViewById(R.id.listItems)
  54.  
  55.         listView.adapter = ItemAdapter(this, items)
  56.         listView.setOnItemClickListener { adapterView: AdapterView<*>, view1: View, i: Int, l: Long ->
  57.             val intent = Intent(this, ItemActivity::class.java)
  58.             intent.putExtra("index", i)
  59.             intent.putExtra("item", items[i])
  60.             startActivityForResult(intent, 0)
  61.         }
  62.  
  63.         val fab: View = findViewById(R.id.fab)
  64.         fab.setOnClickListener {
  65.             val intent = Intent(this, ItemActivity::class.java)
  66.             startActivityForResult(intent, 0)
  67.         }
  68.  
  69.     }
  70.  
  71.     override fun onResume() {
  72.         super.onResume()
  73.         startTracking()
  74.     }
  75.  
  76.     override fun onPause() {
  77.         super.onPause()
  78.         stopTracking()
  79.     }
  80.  
  81.     override fun onActivityResult(requestCode: Int, resultCode: Int,
  82.                                   data: Intent?) {
  83.         super.onActivityResult(requestCode, resultCode, data)
  84.         if (resultCode == Activity.RESULT_OK) {
  85.             Log.i("Infoo", "Item added")
  86.             val index: Int = data?.getIntExtra("index", -1) ?: -1
  87.             val item: Item = data?.getParcelableExtra("item") ?: Item()
  88.             val cv = ContentValues()
  89.             cv.put("title", item.title)
  90.             cv.put("latitude", item.latitude)
  91.             cv.put("longitude", item.longitude)
  92.  
  93.             if (index != -1) {
  94.                 items[index] = item
  95.                 cv.put("id", item.id)
  96.                 con.update("items", cv, "id=?", arrayOf(item.id.toString()))
  97.             }
  98.             else {
  99.                 items.add(item)
  100.                 con.insert("items", null, cv)
  101.             }
  102.             val listView: ListView = findViewById(R.id.listItems)
  103.             (listView.adapter as ItemAdapter).notifyDataSetChanged()
  104.         }
  105.         if (resultCode == 111) {
  106.             Log.i("Infoo", "Item deleted")
  107.             val index: Int = data?.getIntExtra("index", -1) ?: -1
  108.             val item: Item = data?.getParcelableExtra("item") ?: Item()
  109.             items.removeAt(index)
  110.             con.delete("items","id=?",  arrayOf(item.id.toString()))
  111.             val listView: ListView = findViewById(R.id.listItems)
  112.             (listView.adapter as ItemAdapter).notifyDataSetChanged()
  113.         }
  114.     }
  115.  
  116.     private fun getItems() {
  117.         val cursor = con.query("items",
  118.             arrayOf("id", "title", "latitude", "longitude"),
  119.             null, null, null, null, null)
  120.         cursor.moveToFirst()
  121.         while (!cursor.isAfterLast) {
  122.             val s = Item()
  123.             s.id = cursor.getInt(0)
  124.             s.title = cursor.getString(1)
  125.             s.latitude = cursor.getDouble(2)
  126.             s.longitude = cursor.getDouble(3)
  127.             items.add(s)
  128.             cursor.moveToNext()
  129.         }
  130.         cursor.close()
  131.     }
  132.  
  133.     fun startTracking() {
  134.         // Проверяем есть ли разрешение
  135.         if (ContextCompat.checkSelfPermission(this,
  136.                 Manifest.permission.ACCESS_FINE_LOCATION) !=
  137.             PackageManager.PERMISSION_GRANTED) {
  138.             // Разрешения нет. Нужно ли показать пользователю пояснения?
  139.             if (ActivityCompat.shouldShowRequestPermissionRationale(this,
  140.                     Manifest.permission.ACCESS_FINE_LOCATION)) {
  141.                 // Показываем пояснения
  142.                 showWarning()
  143.             }
  144.             else {
  145.                 // Пояснений не требуется, запрашиваем разрешение
  146.  
  147.                 ActivityCompat.requestPermissions(this,
  148.                     arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
  149.                     MY_PERMISSIONS_REQUEST_LOCATION)
  150.             }
  151.         }
  152.         else {
  153.             hideWarning()
  154.             findViewById<FloatingActionButton>(R.id.fab).visibility = View.VISIBLE
  155.             locationManager!!.requestLocationUpdates(
  156.                 LocationManager.GPS_PROVIDER, 1000, 10f, locationListener)
  157.             locationManager!!.requestLocationUpdates(
  158.                 LocationManager.NETWORK_PROVIDER, 1000, 10f, locationListener)
  159.             showInfo()
  160.         }
  161.     }
  162.  
  163.     fun stopTracking() {
  164.         locationManager!!.removeUpdates(locationListener)
  165.     }
  166.  
  167.     @SuppressLint("SetTextI18n")
  168.     private fun showInfo(location: Location? = null) {
  169.         val isGpsOn = locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER)
  170.         val isNetworkOn = locationManager!!.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
  171.             if (!isGpsOn and !isNetworkOn) {
  172.                 findViewById<TextView>(R.id.gps_coordinates).text = "Передача геоданных не работает"
  173.             }
  174.  
  175.         if (location != null) {
  176.             if (location.provider == LocationManager.GPS_PROVIDER) {
  177.                 findViewById<TextView>(R.id.gps_coordinates).text =
  178.                     "Текущие координаты: " + location.latitude.toString() + ", " + location.longitude.toString()
  179.             } else
  180.             if (location.provider == LocationManager.NETWORK_PROVIDER) {
  181.                 findViewById<TextView>(R.id.gps_coordinates).text =
  182.                     "Текущие координаты: " + location.latitude.toString() +
  183.                             ", " + location.longitude.toString()
  184.             }
  185.         }
  186.     }
  187.  
  188.     private fun gaverSinus(lat1: Double, lat2: Double, lon1: Double, lon2: Double): Double {
  189.  
  190.         val earthRadius: Double = 6372.8
  191.         val dLat = Math.toRadians(lat2 - lat1);
  192.         val dLon = Math.toRadians(lon2 - lon1);
  193.         val originLat = Math.toRadians(lat1);
  194.         val destinationLat = Math.toRadians(lat2);
  195.         val a = Math.pow(Math.sin(dLat / 2), 2.toDouble()) + Math.pow(Math.sin(dLon / 2), 2.toDouble()) * Math.cos(originLat) * Math.cos(destinationLat);
  196.         val c = 2 * Math.asin(Math.sqrt(a))
  197.  
  198.         return earthRadius*c*1000
  199.     }
  200.  
  201.     @SuppressLint("SetTextI18n")
  202.     fun checkLocation(location: Location) {
  203.         var bool = false
  204.         var str = ""
  205.         for (i in items) {
  206.             val d = gaverSinus(location.latitude, i.latitude, location.longitude, i.longitude)
  207.             Log.i("info_1", "${i.title}: $d")
  208.             if (d<=100) {
  209.                 bool = true
  210.                 str += "${i.title} (${ceil(d)}м.)\n"
  211.             }
  212.         }
  213.         val view = findViewById<TextView>(R.id.notification)
  214.         if (bool) {
  215.             view.text = "Вы находитесь около точек: \n$str"
  216.             view.visibility = View.VISIBLE
  217.         } else {
  218.             view.visibility = View.GONE
  219.         }
  220.     }
  221.  
  222.     private fun showWarning() {
  223.         findViewById<Button>(R.id.settings).visibility = View.VISIBLE
  224.         findViewById<TextView>(R.id.notification).visibility = View.VISIBLE
  225.     }
  226.  
  227.     private fun hideWarning() {
  228.         findViewById<Button>(R.id.settings).visibility = View.GONE
  229.         findViewById<TextView>(R.id.notification).visibility = View.GONE
  230.     }
  231.  
  232.     override fun onRequestPermissionsResult(requestCode: Int,
  233.                                             permissions: Array<String>,
  234.                                             grantResults: IntArray) {
  235.         if (requestCode == MY_PERMISSIONS_REQUEST_LOCATION) {
  236.             if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
  237.                 hideWarning()
  238.                 startTracking()
  239.             } else {
  240.                 showWarning()
  241.             }
  242.  
  243.         }
  244.     }
  245.  
  246.     fun buttonOpenSettings(view: View) {
  247.         val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
  248.         startActivity(intent)
  249.     }
  250.  
  251. }
  252.  
RAW Paste Data