Skip to content

Commit

Permalink
Add detail screen
Browse files Browse the repository at this point in the history
  • Loading branch information
andrea-liu87 committed Feb 15, 2022
1 parent 10481cc commit 5917965
Show file tree
Hide file tree
Showing 15 changed files with 532 additions and 106 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:name=".di.AwasGempaBumiApplication"
Expand Down
11 changes: 6 additions & 5 deletions app/src/main/java/io/chronostech/awasgempabumi/API.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
package io.chronostech.awasgempabumi

import io.chronostech.awasgempabumi.model.EarthQuakeResponse
import io.chronostech.awasgempabumi.model.Infogempa
import retrofit2.Call
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET

interface API {
@GET("gempadirasakan.json")
suspend fun getResponse() : Response<EarthQuakeResponse>
suspend fun getResponse(): Response<EarthQuakeResponse>

@GET("gempaterkini.json")
suspend fun getResponseBigMagnitude(): Response<EarthQuakeResponse>

companion object {
var apiInterface : API? = null
var apiInterface: API? = null
var BASE_URL = "https://data.bmkg.go.id/DataMKG/TEWS/"

fun create() : API {
fun create(): API {
if (apiInterface == null) {
val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package io.chronostech.awasgempabumi

import android.app.Application
import androidx.lifecycle.MutableLiveData
import io.chronostech.awasgempabumi.model.EarthQuakeResponse
import io.chronostech.awasgempabumi.model.Gempa
import io.chronostech.awasgempabumi.model.Infogempa
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject


class EarthQuakeRepo @Inject constructor(private val retrofitService : API) {
suspend fun getResponse(): Response<EarthQuakeResponse> = retrofitService.getResponse()

suspend fun getResponseBigMagnitude(): Response<EarthQuakeResponse> =
retrofitService.getResponseBigMagnitude()
}
47 changes: 47 additions & 0 deletions app/src/main/java/io/chronostech/awasgempabumi/Util.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,61 @@ class Util {
companion object {
private val acehBound = LatLngBounds(LatLng(2.00, 95.00), LatLng(6.00, 99.00))
private val sumutBound = LatLngBounds(LatLng(1.00, 97.00), LatLng(5.00, 101.00))
private val sumbarBound = LatLngBounds(LatLng(1.00, 98.00), LatLng(4.00, 102.00))
private val riauBound = LatLngBounds(LatLng(2.00, 100.00), LatLng(3.00, 109.00))
private val kepriBound = LatLngBounds(LatLng(-3.00, 101.00), LatLng(-1.00, 104.00))
private val jambiBound = LatLngBounds(LatLng(-3.00, 101.00), LatLng(-1.00, 105.00))
private val sumselBound = LatLngBounds(LatLng(-5.00, 102.00), LatLng(-1.00, 107.00))
private val bengkuluBound = LatLngBounds(LatLng(-6.00, 101.00), LatLng(-2.00, 104.00))
private val lampungBound = LatLngBounds(LatLng(-7.00, 103.00), LatLng(-3.00, 106.00))
private val babelBound = LatLngBounds(LatLng(-4.00, 105.00), LatLng(-1.00, 109.00))

private val jakartaBound = LatLngBounds(LatLng(-7.00, 106.00), LatLng(-6.00, 107.00))
private val jabarBound = LatLngBounds(LatLng(-8.00, 106.00), LatLng(-5.00, 109.00))
private val bantenBound = LatLngBounds(LatLng(-8.00, 105.00), LatLng(-5.00, 107.00))
private val jatengBound = LatLngBounds(LatLng(-9.00, 108.00), LatLng(-6.00, 112.00))
private val jogjaBound = LatLngBounds(LatLng(-9.00, 110.00), LatLng(-7.00, 111.00))
private val jatimBound = LatLngBounds(LatLng(-9.00, 110.00), LatLng(-6.00, 115.00))
private val baliBound = LatLngBounds(LatLng(-9.00, 114.00), LatLng(-8.00, 116.00))
private val ntbBound = LatLngBounds(LatLng(-10.00, 115.00), LatLng(-8.00, 120.00))
private val nttBound = LatLngBounds(LatLng(-11.00, 118.00), LatLng(-8.00, 126.00))

// 27 . Sulawesi Tengah : 2ºLU-4ºLS dan 119º-125ºBT
//
// 28 . Sulawesi Selatan : 0ºLS-8ºLS dan 118º-122ºBT
//
// 29. Sulawesi Barat: 0ºLS-3ºLS dan 118º-120ºBT
//
// 30 . Sulawesi Tenggara : 2ºLS-7ºLS dan 120º-125ºBT
//
// 31 . Maluku : 0ºLS-9ºLS dan 124º-136ºBT
//
// 32 . Maluku utara : 3ºLU-º3LS dan 124º-129ºBT
private val sulutBound = LatLngBounds(LatLng(0.00, 118.00), LatLng(8.00, 112.00))
private val gorontaloBound = LatLngBounds(LatLng(0.00, 120.00), LatLng(1.00, 124.00))
private val papuaBound = LatLngBounds(LatLng(-6.00, 131.00), LatLng(-1.00, 141.00))
private val papuaBaratBound = LatLngBounds(LatLng(-5.00, 130.00), LatLng(0.00, 138.00))

val province = mapOf(
"Aceh" to acehBound,
"Sumatra Utara" to sumutBound,
"Sumatra Barat" to sumbarBound,
"Riau" to riauBound,
"Kepulauan Riau" to kepriBound,
"Jambi" to jambiBound,
"Sumatra Selatan" to sumselBound,
"Bengkulu" to bengkuluBound,
"Lampung" to lampungBound,
"Bangka Belitung" to babelBound,
"Jakarta" to jakartaBound,
"Jawa Barat" to jabarBound,
"Banten" to bantenBound,
"Jawa Tengah" to jatengBound,
"Jawa Timur" to jatimBound,
"DIY Jogyakarta" to jogjaBound,
"Bali" to baliBound,
"NTB" to ntbBound,
"NTT" to nttBound,
"Papua" to papuaBound,
"Papua Barat" to papuaBaratBound
)
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/io/chronostech/awasgempabumi/model/Gempa.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,7 @@ class Gempa {
@SerializedName("Dirasakan")
@Expose
var dirasakan: String? = null

@SerializedName("Potensi")
var potensi: String? = null
}
183 changes: 136 additions & 47 deletions app/src/main/java/io/chronostech/awasgempabumi/view/DetailFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,22 @@ package io.chronostech.awasgempabumi.view

import android.Manifest
import android.annotation.SuppressLint
import android.content.ContentValues
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.Canvas
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.NavHostFragment
Expand All @@ -26,6 +35,11 @@ import dagger.hilt.android.AndroidEntryPoint
import io.chronostech.awasgempabumi.Util.Companion.province
import io.chronostech.awasgempabumi.databinding.FragmentDetailBinding
import io.chronostech.awasgempabumi.viewmodel.DetailViewModel
import java.io.File
import java.io.FileOutputStream
import java.io.OutputStream
import java.text.SimpleDateFormat
import java.util.*

@AndroidEntryPoint
class DetailFragment : Fragment(), OnMapReadyCallback {
Expand All @@ -49,26 +63,63 @@ class DetailFragment : Fragment(), OnMapReadyCallback {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.gempa.value?.coordinates?.let { viewModel.getPotensiTsunami(it) }

viewModel.gempa.observe(viewLifecycleOwner, {
val coordinate = it.coordinates!!.split(",")
val latitude: Double = coordinate.get(0).toDouble()
val longitude: Double = coordinate.get(1).toDouble()
val latLng = LatLng(latitude, longitude)

val detailPlace = it.dirasakan?.replace("I", "")?.replace("V", "")?.removePrefix("-")
?.removePrefix(" ")?.split(", ")
province.forEach { bound ->
if (bound.value.contains(latLng)) {
binding.tvDetailPlace.text = "${detailPlace?.get(0)}, ${bound.key}"
} else {
binding.tvDetailPlace.text = "${detailPlace?.get(0)}"
}
}

val coordinate = viewModel.gempa.value?.coordinates!!.split(",")
val latitude: Double = coordinate.get(0).toDouble()
val longitude: Double = coordinate.get(1).toDouble()
val latLng = LatLng(latitude, longitude)
binding.tvMagnitude.text = String.format("%.2f", it.magnitude?.toDouble())
binding.tvTimeGempa.text = formatTime(it.dateTime!!)
binding.tvLatlon.text = "${it.lintang}, ${it.bujur}"
binding.tvDepth.text = it.kedalaman
binding.clPotensi.visibility = View.INVISIBLE
})

province.forEach {
if (it.value.contains(latLng)) {
binding.tvDetailPlace.text = it.key
viewModel.potensiTsunami.observe(viewLifecycleOwner, {
if (it) {
binding.clPotensi.visibility = View.VISIBLE
}
}
})

if (checkLocationPermission()) setupMapView(savedInstanceState)
if (allPermissionsGranted()) {
setupMapView(savedInstanceState)
} else {
permReqLauncher.launch(REQUIRED_PERMISSIONS)
}
setupAds()

binding.btnShare.setOnClickListener {
shareAction()
}
binding.btnShare.visibility = View.GONE

binding.btnBack.setOnClickListener {
NavHostFragment.findNavController(this).navigateUp()
}
}

private fun formatTime(dateTime: String): String {
val serverFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US)
serverFormat.timeZone = TimeZone.getTimeZone("UTC")
val date = serverFormat.parse(dateTime)
val displayFormat = SimpleDateFormat("dd MMM yyyy HH:mm", Locale.getDefault())
displayFormat.timeZone = TimeZone.getDefault()
return displayFormat.format(date)
}

private fun setupAds() {
MobileAds.initialize(requireContext()) {
val adRequest = AdRequest.Builder().build()
Expand Down Expand Up @@ -109,48 +160,80 @@ class DetailFragment : Fragment(), OnMapReadyCallback {
}
}

private fun checkLocationPermission(): Boolean {
if (ActivityCompat.checkSelfPermission(
requireContext(), Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
requestPermissions(
arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
), LOCATION_PERMISSION_REQUEST
)
return false
}
return true
private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
requireContext(), it
) == PackageManager.PERMISSION_GRANTED
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
when (requestCode) {
LOCATION_PERMISSION_REQUEST -> {
if ((grantResults.isNotEmpty() &&
grantResults[0] == PackageManager.PERMISSION_GRANTED)
) {
setupMapView(null)
} else {
Toast.makeText(
requireContext(),
"Ijin lokasi aplikasi ditolak",
Toast.LENGTH_LONG
).show()
}
return
private val permReqLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
val granted = permissions.entries.all {
it.value
}
else -> {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (granted) {
setupMapView(null)
} else {
Toast.makeText(
requireContext(),
"Permissions not granted by the user.",
Toast.LENGTH_SHORT
).show()
}
}

private fun shareAction() {
val view = binding.clFrame
val bitmap = Bitmap.createBitmap(
view.measuredWidth,
view.measuredHeight,
Bitmap.Config.ARGB_8888
)

val canvas = Canvas(bitmap)
view.layout(view.left, view.top, view.right, view.bottom)
view.draw(canvas)

val imageUri = saveImage(bitmap)

val shareIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, imageUri)
type = "image/*"
}
startActivity(Intent.createChooser(shareIntent, "Bagikan laman ini"))
}

private fun saveImage(bitmap: Bitmap): Uri? {
var fos: OutputStream? = null
var imageUri: Uri? = null

val timestamp = SimpleDateFormat("yyyyMMdd_hhMMss").format(Date())

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val resolver = requireContext().contentResolver
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, timestamp)
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/PNG")
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + "AwasGempaBumi")
imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
fos = resolver.openOutputStream(imageUri!!)
} else {
val imagesDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM
).toString() + File.separator + "AwasGempaBumi"

val file = File(imagesDir)
if (!file.exists()) file.mkdir()
val image = File(imagesDir, timestamp + ".png")
imageUri = Uri.fromFile(image)
fos = FileOutputStream(image)
}

bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
fos?.flush()
fos?.close()
return imageUri
}

override fun onDestroyView() {
Expand All @@ -161,5 +244,11 @@ class DetailFragment : Fragment(), OnMapReadyCallback {
companion object {
var latitude: Double? = null
var longitude: Double? = null

private val REQUIRED_PERMISSIONS = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
}
}
Loading

0 comments on commit 5917965

Please sign in to comment.