Advertisement
asykur

Untitled

Aug 23rd, 2023
1,351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 17.26 KB | Source Code | 0 0
  1. package com.telkom.tuya.presentation.devices.smartcamera
  2.  
  3. import android.annotation.SuppressLint
  4. import android.app.AlertDialog
  5. import android.app.Dialog
  6. import android.content.Context
  7. import android.content.Intent
  8. import android.graphics.Color
  9. import android.graphics.drawable.ColorDrawable
  10. import android.graphics.drawable.InsetDrawable
  11. import android.net.wifi.WifiManager
  12. import android.os.Bundle
  13. import android.view.LayoutInflater
  14. import android.view.Window
  15. import android.widget.Button
  16. import android.widget.ImageView
  17. import android.widget.TextView
  18. import android.widget.Toast
  19. import androidx.activity.result.contract.ActivityResultContracts
  20. import androidx.lifecycle.Lifecycle
  21. import androidx.lifecycle.lifecycleScope
  22. import androidx.lifecycle.repeatOnLifecycle
  23. import com.bumptech.glide.Glide
  24. import com.bumptech.glide.load.engine.DiskCacheStrategy
  25. import com.google.android.material.snackbar.Snackbar
  26. import com.telkom.eazy.auth.data.UserData
  27. import com.telkom.eazy.videoanalytic.VideoAnalyticActivity
  28. import com.telkom.indihome.common.data.source.remote.response.ihs.DataDetailInvoice
  29. import com.telkom.indihome.common.data.source.remote.response.ihs.DataStatus
  30. import com.telkom.indihome.common.databinding.LayoutCloudServiceStatusBinding
  31. import com.telkom.indihome.common.domain.model.CameraQuality
  32. import com.telkom.indihome.common.domain.model.DeviceData
  33. import com.telkom.indihome.common.domain.model.WmsOrderStatusDomain
  34. import com.telkom.indihome.common.ui.ipc.BaseIPCActivity
  35. import com.telkom.indihome.common.ui.ipc.BaseIPCFragment
  36. import com.telkom.indihome.common.utils.*
  37. import com.telkom.indihome.common.utils.extensions.gone
  38. import com.telkom.indihome.common.utils.extensions.invisible
  39. import com.telkom.indihome.common.utils.extensions.visible
  40. import com.telkom.tuya.R
  41. import com.telkom.tuya.presentation.cloudservice.CloudActivationActivity
  42. import com.telkom.tuya.presentation.cloudservice.buypackage.uistate.CloudStatusUiState
  43. import com.telkom.tuya.presentation.cloudservice.buypackage.uistate.DetailInvoiceUiState
  44. import com.telkom.tuya.presentation.cloudservice.wms.WmsOrderStratusUiState
  45. import com.telkom.tuya.presentation.devices.smartcamera.camera.TuyaCameraFragment
  46. import com.telkom.tuya.presentation.devices.smartcamera.multiview.CameraMultiviewActivity
  47. import com.telkom.tuya.presentation.devices.smartcamera.playback.TuyaIPCPlaybackActivity
  48. import com.telkom.tuya.presentation.devices.smartcamera.properties.TuyaSmartCameraPropertiesActivity
  49. import kotlinx.coroutines.launch
  50. import org.koin.android.ext.android.inject
  51. import org.koin.androidx.viewmodel.ext.android.viewModel
  52.  
  53.  
  54. class NewTuyaSmartCameraActivity : BaseIPCActivity() {
  55.  
  56.     lateinit var cloudStatus: DataStatus
  57.     val deviceId by lazy { intent.getStringExtra("deviceId") ?: "" }
  58.     val brand by lazy { intent.getStringExtra("brand") ?: "" }
  59.     val category by lazy { intent.getStringExtra("category") ?: "" }
  60.     val notificationSetting by lazy { intent.getStringExtra("notificationSetting") ?: "" }
  61.     private var status = "disable"
  62.     private lateinit var deviceName: String
  63.     private lateinit var autoPlay: String
  64.     private val tuyaViewModel: NewTuyaSmartCameraViewModel by viewModel()
  65.     private val analyticsHelper: AnalyticsHelper by inject()
  66.     val deviceData by lazy { intent.getParcelableExtra<DeviceData>("deviceData")}
  67.     private val userData: UserData by inject()
  68.  
  69.     private val videoAnalyticActivationDialog by lazy {
  70.         val dialog = Dialog(this)
  71.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
  72.         dialog.setContentView(R.layout.dialog_video_analytic_activation)
  73.         dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
  74.         dialog.findViewById<Button>(R.id.btn_set_now).setOnClickListener {
  75.             dialog.dismiss()
  76.             Intent(this, VideoAnalyticActivity::class.java).also { intent ->
  77.                 intent.putExtra("deviceSerial", deviceId)
  78.                 startActivity(intent)
  79.             }
  80.         }
  81.         dialog.findViewById<Button>(R.id.btn_set_next_time).setOnClickListener {
  82.             dialog.dismiss()
  83.         }
  84.         dialog.setOnDismissListener {
  85.             tuyaViewModel.setVideoAnalyticActivationDialogShown()
  86.         }
  87.         dialog.setCancelable(false)
  88.         dialog
  89.     }
  90.  
  91.     companion object {
  92.         var refreshBanner = false
  93.     }
  94.  
  95.     override fun onResume() {
  96.         super.onResume()
  97.         if (refreshBanner) {
  98.             tuyaViewModel.getCloudStatus("tuya", deviceId)
  99.         }
  100.     }
  101.  
  102.     override fun onDestroy() {
  103.         super.onDestroy()
  104.         refreshBanner = false
  105.     }
  106.  
  107.     private fun getSSIDName():String {
  108.         val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
  109.         val wifiInfo = wifiManager.connectionInfo
  110.         val ssid = wifiInfo.ssid.removeSurrounding("\"")
  111.         return ssid
  112.     }
  113.  
  114.     override fun onCreate(savedInstanceState: Bundle?) {
  115.         deviceName = intent.getStringExtra("deviceName") ?: ""
  116.         autoPlay = intent.getStringExtra("autoplay") ?: ""
  117.         super.onCreate(savedInstanceState)
  118.         viewModel.deviceId = deviceId
  119.         viewModel.deviceName = deviceName
  120.         viewModel.brand = "tuya"
  121.  
  122.         val ssid = getSSIDName()
  123.  
  124.         Toast.makeText(this, "SSID = $ssid & WMS_ID = ${userData.wmsId}", Toast.LENGTH_LONG).show()
  125.         // check user wms
  126.         if (userData.wmsId != null && getSSIDName() == "iot@wifi.id"){
  127.             // request wms status
  128.             tuyaViewModel.getWmsOrderStatus(userData.wmsId.orEmpty())
  129.         }
  130.  
  131. //        tuyaViewModel.getWmsOrderStatus("test_wmsId_0059") // demo
  132.  
  133.  
  134.         lifecycleScope.launch {
  135.             repeatOnLifecycle(Lifecycle.State.STARTED) {
  136.                 launch {
  137.                     tuyaViewModel.errorMessage.collect {
  138.                         if (it.isNotEmpty())
  139.                             Toast.makeText(this@NewTuyaSmartCameraActivity, it, Toast.LENGTH_SHORT)
  140.                                 .show()
  141.                     }
  142.                 }
  143.                 launch {
  144.                     tuyaViewModel.showVideoAnalyticActivationDialog.collect {
  145.                         if (it) videoAnalyticActivationDialog.show()
  146.                     }
  147.                 }
  148.             }
  149.         }
  150.  
  151.         tuyaViewModel.bitrate.observe(this) {
  152.             setOnBitrate(it, "KB/s")
  153.         }
  154.         tuyaViewModel.clarity.observe(this) {
  155.             val quality = when (it) {
  156.                 2 -> CameraQuality.SD
  157.                 4 -> CameraQuality.HD
  158.                 else -> CameraQuality.HD
  159.             }
  160.             setOnCameraQuality(quality)
  161.         }
  162.         initObserver()
  163.         //fetch cloud status data
  164.         tuyaViewModel.getCloudStatus("tuya", deviceId)
  165.  
  166.     }
  167.  
  168.     @SuppressLint("SetTextI18n")
  169.     private fun inflateBannerView(dataStatus: DataStatus, detailInvoice: DataDetailInvoice?) {
  170.         val view =
  171.             LayoutInflater.from(this).inflate(R.layout.layout_cloud_service_status, null, false)
  172.         val vBinding = LayoutCloudServiceStatusBinding.bind(view)
  173.         dataStatus.cloud_status?.let {
  174.             when (it.status) {
  175.                 ENABLE -> {
  176.                     dataStatus.invoiceNumber?.let { logEventActivation(it) }
  177.                     Glide.with(this)
  178.                         .load(CLOUD_STATUS_ACTIVE)
  179.                         .diskCacheStrategy(DiskCacheStrategy.NONE)
  180.                         .skipMemoryCache(true)
  181.                         .into(vBinding.ivBanner)
  182.                 }
  183.                 ISOLIR -> {
  184.                     Glide.with(this)
  185.                         .load(CLOUD_STATUS_ISOLIR)
  186.                         .diskCacheStrategy(DiskCacheStrategy.NONE)
  187.                         .skipMemoryCache(true)
  188.                         .into(vBinding.ivBanner)
  189.                 }
  190.                 PENDING -> {
  191.                     Glide.with(this)
  192.                         .load(CLOUD_STATUS_PENDING)
  193.                         .diskCacheStrategy(DiskCacheStrategy.NONE)
  194.                         .skipMemoryCache(true)
  195.                         .into(vBinding.ivBanner)
  196.                 }
  197.                 else -> {
  198.                     Glide.with(this)
  199.                         .load(CLOUD_STATUS_INACTIVE)
  200.                         .diskCacheStrategy(DiskCacheStrategy.NONE)
  201.                         .skipMemoryCache(true)
  202.                         .into(vBinding.ivBanner)
  203.                 }
  204.             }
  205.         }
  206.  
  207.         view.setOnClickListener {
  208.             onCloudServiceClicked(dataStatus)
  209.         }
  210.         addBannerView(view)
  211.     }
  212.  
  213.     private fun logEventActivation(invoiceNumber: String) {
  214.         val sp = getSharedPreferences("CloudActivation", Context.MODE_PRIVATE)
  215.         if (sp.getString(invoiceNumber, null) == null) {
  216.             sp.edit().putString(invoiceNumber, "OK").apply()
  217.             analyticsHelper.trackEventAnalytics(
  218.                 FA_CHECK_CLOUD_STATUS,
  219.                 EventProperties(
  220.                     success = 1,
  221.                     message = "OK",
  222.                     id_param = deviceId,
  223.                     details = deviceName,
  224.                     parent = category,
  225.                     child = brand
  226.                 )
  227.             )
  228.         }
  229.     }
  230.  
  231.     private fun initObserver() {
  232.         lifecycleScope.launch{
  233.             lifecycleScope.launchWhenCreated {
  234.                 tuyaViewModel.wmsOrderStratusUiState.collect{ uiState ->
  235.                     when(uiState){
  236.                         is WmsOrderStratusUiState.ShowLoading -> {}
  237.                         is WmsOrderStratusUiState.OnSuccess -> {
  238.                             checkWmsStatus(uiState.data)
  239.                         }
  240.                         is WmsOrderStratusUiState.OnError -> {
  241.                             Snackbar.make(binding.root, uiState.message.toString(), Snackbar.LENGTH_SHORT).show()
  242.                         }
  243.                     }
  244.                 }
  245.             }
  246.         }
  247.  
  248.         lifecycleScope.launch() {
  249.             lifecycleScope.launchWhenCreated {
  250.                 tuyaViewModel.cloudStatusUiState.collect { uiState ->
  251.                     when (uiState) {
  252.                         is CloudStatusUiState.ShowLoading -> showLoadingBanner()
  253.                         is CloudStatusUiState.ShowCloudStatus -> {
  254.                             cloudStatus = uiState.data
  255.                             status = uiState.data.cloud_status?.status ?: "disable"
  256.                             inflateBannerView(cloudStatus, null)
  257.                             tuyaViewModel.getVideoAnalyticActivationDialog(status == "enable")
  258. //                            tuyaViewModel.getInvoiceDetail(userData.userId, cloudStatus.invoiceNumber ?: "")
  259.                         }
  260.                         is CloudStatusUiState.CommonError -> {
  261.                             binding.containerBanner.gone()
  262.                             binding.shimmerLiveBanner.root.stopShimmer()
  263.                             binding.shimmerLiveBanner.root.gone()
  264.                             Snackbar.make(binding.root, uiState.errorMessage, Snackbar.LENGTH_SHORT)
  265.                                 .show()
  266.                         }
  267.                     }
  268.                 }
  269.             }
  270.         }
  271.  
  272.         lifecycleScope.launch {
  273.             lifecycleScope.launchWhenCreated {
  274.                 tuyaViewModel.invoiceUiState.collect{ uiState ->
  275.                     when(uiState){
  276.                         is DetailInvoiceUiState.ShowLoading ->{
  277.                             binding.shimmerLiveBanner.root.startShimmer()
  278.                             binding.shimmerLiveBanner.root.visible()
  279.                             binding.containerBanner.invisible()
  280.                         }
  281.                         is DetailInvoiceUiState.ShowDetailInvoice ->{
  282.                             binding.shimmerLiveBanner.root.stopShimmer()
  283.                             binding.shimmerLiveBanner.root.gone()
  284.                             binding.containerBanner.visible()
  285.                             inflateBannerView(cloudStatus, uiState.data)
  286.                         }
  287.                         is DetailInvoiceUiState.CommonError ->{
  288.                             binding.shimmerLiveBanner.root.stopShimmer()
  289.                             binding.shimmerLiveBanner.root.gone()
  290.                             binding.containerBanner.gone()
  291.                             Snackbar.make(binding.root, uiState.errorMessage, Snackbar.LENGTH_SHORT).show()
  292.                         }
  293.                     }
  294.                 }
  295.             }
  296.         }
  297.     }
  298.  
  299.     private fun checkWmsStatus(data: WmsOrderStatusDomain?) {
  300.         if (data?.data?.status == "suspend"){
  301.             showPopupIsolir()
  302.         }
  303.     }
  304.  
  305.     private fun showLoadingBanner() {
  306.  
  307.     }
  308.  
  309.     override fun getCameraName(): String {
  310.         return deviceName
  311.     }
  312.  
  313.     override fun getCameraBrand(): String = "tuya"
  314.  
  315.     override fun getCameraFragment(): BaseIPCFragment {
  316.         return TuyaCameraFragment.newInstance(deviceId, deviceName, brand, category)
  317.     }
  318.  
  319.     override fun getCloudStatus(): String {
  320.         return status
  321.     }
  322.  
  323.     override fun onCloudServiceClicked(data: DataStatus) {
  324.         val bundle = Bundle()
  325.         bundle.putString("deviceName", deviceName)
  326.         bundle.putString("deviceId", deviceId)
  327.         bundle.putString("brand", brand)
  328.         bundle.putString("status", status)
  329.         bundle.putParcelable("cloudStatus", cloudStatus)
  330.         bundle.putParcelable("deviceData", deviceData)
  331.         val intent = Intent(Intent(this, CloudActivationActivity::class.java))
  332.         intent.putExtras(bundle)
  333.         startActivity(intent)
  334.     }
  335.  
  336.  
  337.     override fun getAvailableQuality(): List<CameraQuality> = listOf(
  338.         CameraQuality.HD, CameraQuality.SD
  339.     )
  340.  
  341.     private val resultLauncher =
  342.         registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
  343.             if (result.resultCode == RESULT_OK) {
  344.                 val isDeviceRemoved = result.data?.getBooleanExtra(
  345.                     TuyaSmartCameraPropertiesActivity.IS_DEVICE_REMOVED,
  346.                     false
  347.                 )
  348.                 if (isDeviceRemoved == true) finish()
  349.  
  350.                 val updatedDeviceName = result.data?.getStringExtra(
  351.                     TuyaSmartCameraPropertiesActivity.DEVICE_NEW_NAME
  352.                 )
  353.  
  354.                 result.data?.getStringExtra(
  355.                     TuyaSmartCameraPropertiesActivity.AUTOPLAY
  356.                 )?.let {
  357.                     autoPlay = it
  358.                 }
  359.  
  360.                 if (updatedDeviceName.isNullOrEmpty().not()) {
  361.                     deviceName = updatedDeviceName ?: ""
  362.                     supportActionBar?.title = updatedDeviceName
  363.                 }
  364.             }
  365.         }
  366.  
  367.     override fun onCameraQualityChange(quality: CameraQuality) {
  368.         val tuyaQuality = when (quality) {
  369.             CameraQuality.HD -> 4
  370.             CameraQuality.SD -> 2
  371.             else -> 4
  372.         }
  373.         tuyaViewModel.onTapClarity(tuyaQuality)
  374.     }
  375.  
  376.     override fun goToSettingsPage() {
  377.         resultLauncher.launch(
  378.             Intent(
  379.                 this,
  380.                 TuyaSmartCameraPropertiesActivity::class.java
  381.             ).also { intent ->
  382.                 intent.putExtra("deviceId", deviceId)
  383.                 intent.putExtra("deviceName", deviceName)
  384.                 intent.putExtra("brand", brand)
  385.                 intent.putExtra("isSensor", false)
  386.                 intent.putExtra("notificationSetting", notificationSetting)
  387.                 intent.putExtra("dataStatus", cloudStatus)
  388.                 intent.putExtra("autoplay", autoPlay)
  389.             }
  390.         )
  391.     }
  392.  
  393.     override fun goToMultiviewPage() {
  394.         startActivity(
  395.             Intent(this, CameraMultiviewActivity::class.java)
  396.         )
  397.     }
  398.  
  399.     override fun goToPlaybackPage() {
  400.         val isCameraError = viewModel.cameraError.value.isNullOrBlank().not()
  401.         val isCameraNotConnected = viewModel.cameraOnline.value != true
  402.         startActivity(
  403.             Intent(this, TuyaIPCPlaybackActivity::class.java).apply {
  404.                 putExtra("deviceData", deviceData)
  405.                 putExtra("dataStatus", cloudStatus)
  406.                 putExtra("isSleepMode", viewModel.isSleepMode.value)
  407.                 putExtra("isCameraError", isCameraError)
  408.                 putExtra("isCameraNotConnected", isCameraNotConnected)
  409.             }
  410.         )
  411.     }
  412.  
  413.     private fun showPopupIsolir() {
  414.         val builder = AlertDialog.Builder(this)
  415.         val customView = layoutInflater.inflate(R.layout.layout_popup_alert_wms, null)
  416.         builder.setView(customView)
  417.         builder.setCancelable(false)
  418.  
  419.         val dialog = builder.create()
  420.         val inset = InsetDrawable(ColorDrawable(Color.TRANSPARENT), 50)
  421.         dialog.window?.setBackgroundDrawable(inset)
  422.  
  423.         customView.apply {
  424.             findViewById<TextView>(R.id.tv_title_alert).text = getString(R.string.isolated_title)
  425.             findViewById<TextView>(R.id.tv_desc_alert).text =
  426.                 getString(R.string.isolated_description)
  427.             findViewById<ImageView>(R.id.iv_alert).setImageResource(R.drawable.isolir_wms)
  428.             findViewById<TextView>(R.id.btn_alert_ok).setOnClickListener {
  429.                 dialog.dismiss()
  430.                 finish()
  431.             }
  432.         }
  433.         dialog.show()
  434.     }
  435. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement