/** * TrackerMap * Copyright (C) 2021-2022 Iván Ávalos , Henoch Ojeda * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package mx.trackermap.TrackerMap.android.details import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import android.util.Log import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.DetailsActivityBinding import mx.trackermap.TrackerMap.android.shared.UnitRenderData import kotlin.time.ExperimentalTime @DelicateCoroutinesApi @ExperimentalTime class DetailsActivity : AppCompatActivity() { private var _binding: DetailsActivityBinding? = null private val binding get() = _binding!! private lateinit var adapter: UnitDetailsAdapter private var deviceId: Int = 0 private var deviceName: String = "" private var deviceCategory: String = "" companion object { const val DEVICE_ID_EXTRA = "device_id" const val DEVICE_NAME_EXTRA = "device_name" const val DEVICE_CATEGORY_EXTRA = "device_category" const val ACTION_EXTRA = "action" } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) _binding = DetailsActivityBinding.inflate(layoutInflater) setContentView(binding.root) initialize() } override fun onDestroy() { super.onDestroy() _binding = null } private fun initialize() { deviceId = intent.getIntExtra(DEVICE_ID_EXTRA, 0) deviceName = intent.getStringExtra(DEVICE_NAME_EXTRA) ?: "" deviceCategory = intent.getStringExtra(DEVICE_CATEGORY_EXTRA) ?: "default" val initialSection = intent.getSerializableExtra(ACTION_EXTRA) as UnitRenderData.Action Log.d("DetailsActivity", "Device ID - $deviceId") Log.d("DetailsActivity", "Initial Section - $initialSection") adapter = UnitDetailsAdapter(this, deviceId, deviceName, deviceCategory) binding.detailsPager.adapter = adapter TabLayoutMediator(binding.detailsTabs, binding.detailsPager) { tab, position -> tab.text = when (position) { 0 -> getString(R.string.unit_details) 1 -> getString(R.string.unit_reports) else -> getString(R.string.unit_commands) } }.attach() binding.detailsPager.setCurrentItem( when (initialSection) { UnitRenderData.Action.DETAILS -> 0 UnitRenderData.Action.REPORTS -> 1 else -> 2 }, false ) binding.detailsPager.isUserInputEnabled = when (initialSection) { UnitRenderData.Action.DETAILS -> true UnitRenderData.Action.REPORTS -> false else -> true } binding.detailsTabs.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { binding.detailsPager.isUserInputEnabled = when (tab?.position) { 0 -> true 1 -> false else -> true } } override fun onTabUnselected(tab: TabLayout.Tab?) {} override fun onTabReselected(tab: TabLayout.Tab?) {} }) binding.closeButton.setOnClickListener { finish() } requestPermission {} } private fun requestPermission (callback: (Boolean) -> Unit) { val permission = Manifest.permission.WRITE_EXTERNAL_STORAGE val launcher = registerForActivityResult( ActivityResultContracts.RequestPermission(), callback) when { ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED -> { Log.d("DetailsActivity", "$permission = PackageManager.PERMISSION_GRANTED") } ActivityCompat.shouldShowRequestPermissionRationale(this, permission) -> { Log.d("DetailsActivity", "shouldShowRequestPermissionRationale") AlertDialog.Builder(this) .setTitle(R.string.write_rationale_title) .setMessage(R.string.write_rationale_msg) .setPositiveButton(R.string.shared_ok) { _, _ -> launcher.launch(permission) } .create().show() } else -> { Log.d("DetailsActivity", "Requesting $permission permission") launcher.launch(permission) } } } }