coding-blocks/CBOnlineApp

View on GitHub
app/src/main/java/com/codingblocks/cbonlineapp/mycourse/content/document/PdfActivity.kt

Summary

Maintainability
D
1 day
Test Coverage
package com.codingblocks.cbonlineapp.mycourse.content.document

import android.app.DownloadManager
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.os.PersistableBundle
import android.widget.LinearLayout
import com.codingblocks.cbonlineapp.R
import com.codingblocks.cbonlineapp.baseclasses.BaseCBActivity
import com.codingblocks.cbonlineapp.util.CONTENT_ID
import com.codingblocks.cbonlineapp.util.MediaUtils
import com.codingblocks.cbonlineapp.util.SECTION_ID
import com.codingblocks.cbonlineapp.util.extensions.setToolbar
import com.codingblocks.cbonlineapp.util.extensions.showSnackbar
import com.codingblocks.cbonlineapp.util.livedata.observer
import com.codingblocks.cbonlineapp.util.receivers.DownloadBroadcastReceiver
import com.google.android.material.snackbar.Snackbar
import com.google.firebase.crashlytics.FirebaseCrashlytics
import es.voghdev.pdfviewpager.library.PDFViewPager
import es.voghdev.pdfviewpager.library.adapter.PDFPagerAdapter
import kotlinx.android.synthetic.main.activity_pdf.*
import org.jetbrains.anko.AnkoLogger
import org.koin.androidx.viewmodel.ext.android.stateViewModel
import java.io.File

class PdfActivity : BaseCBActivity(), AnkoLogger {
    lateinit var pdfViewPager: PDFViewPager
    var url: String? = null
    var fileName: String? = null
    var path: String? = null
    var isDownloaded: Boolean = false
    lateinit var receiver: DownloadBroadcastReceiver
    lateinit var intentFilter: IntentFilter
    private val vm: PdfViewModel by stateViewModel()
    lateinit var contentID: String
    lateinit var sectionId: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_pdf)
        setToolbar(toolbarPdfActivity)
        if (savedInstanceState == null) {
            vm.contentId = intent.getStringExtra(CONTENT_ID)
            vm.sectionId = intent.getStringExtra(SECTION_ID)
        }

        vm.getPdf().observer(this) { pdfModel ->
            url = pdfModel.documentPdfLink
            fileName = pdfModel.documentName
            title = pdfModel.title
            checkFile()
        }

        pdfBookmarkBtn.setOnClickListener { view ->
            if (pdfBookmarkBtn.isActivated)
                vm.removeBookmark()
            else {
                vm.markBookmark()
            }
        }
        vm.bookmark.observer(this) {
            pdfBookmarkBtn.isActivated = !it.bookmarkUid.isNullOrEmpty()
        }

        vm.bookmarkLiveData.observer(this) {
            pdfBookmarkBtn.isActivated = it
        }

        vm.bookmarkSnackbar.observer(this) {
            pdfBookmarkBtn.showSnackbar(it, Snackbar.LENGTH_SHORT, action = false)
        }

        intentFilter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
        val downloadManager =
            this@PdfActivity.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager

        receiver = object : DownloadBroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                super.onReceive(context, intent)
                val id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
                val file = File("$path/$fileName")

                downloadManager.addCompletedDownload(
                    fileName,
                    " ",
                    false,
                    "application/pdf",
                    path,
                    file.length(),
                    true
                )
                showpdf(file)
            }
        }

        this@PdfActivity.registerReceiver(receiver, intentFilter)
    }

    override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
        super.onSaveInstanceState(outState, outPersistentState)
        outState.putString(CONTENT_ID, intent.getStringExtra(CONTENT_ID))
        outState.putString(SECTION_ID, intent.getStringExtra(SECTION_ID))
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        contentID = savedInstanceState.getString(CONTENT_ID).toString()
        sectionId = savedInstanceState.getString(SECTION_ID).toString()
    }

    private fun checkFile() {
        fileName?.replace(" ", "_")

        if (MediaUtils.checkPermission(this)) {
            path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                .toString()
            var downloadedFile: File? = null
            val file = File("$path/$fileName")
            val fileDownloads = File(path)
            val filesExisting = fileDownloads.listFiles()
            if (filesExisting != null) {
                for (file1 in filesExisting) {
                    if (file1.name == file.name) {
                        downloadedFile = file
                        isDownloaded = true
                        break
                    }
                }
            }
            if (!isDownloaded)
                downloadFile()
            else if (isDownloaded) {
                showpdf(downloadedFile!!)
            }
        } else {
            if (MediaUtils.isStoragePermissionGranted(this)) {
                this.recreate()
            } else {
                onBackPressed()
            }
        }

        intentFilter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
        val downloadManager =
            this@PdfActivity.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager

        receiver = object : DownloadBroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                super.onReceive(context, intent)
                val id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
                val file = File("$path/$fileName")

                downloadManager.addCompletedDownload(
                    fileName,
                    " ",
                    false,
                    "application/pdf",
                    path,
                    file.length(),
                    true
                )
                showpdf(file)
            }
        }
        this@PdfActivity.registerReceiver(receiver, intentFilter)
    }

    private fun showpdf(downloadedFile: File) {
        pdfViewPager = PDFViewPager(this, downloadedFile.absolutePath)

        root.addView(
            pdfViewPager,
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT
        )
    }

    private fun downloadFile() {
        try {
            val request = DownloadManager.Request(Uri.parse(url))
            request.setTitle(fileName)
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)
            // get download service and enqueue file
            val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
            manager.enqueue(request)
        } catch (e: java.lang.Exception) {
            FirebaseCrashlytics.getInstance().log("Error Downloading Pdf: $url}")
        }
    }

    override fun onDestroy() {
        if (MediaUtils.checkPermission(this)) {
            try {
                val adapter = pdfViewPager.adapter
                if (adapter is PDFPagerAdapter)
                    adapter.close()
                pdfViewPager.adapter = null
            } catch (e: Exception) {
                finish()
            }
        }
        this@PdfActivity.unregisterReceiver(receiver)
        super.onDestroy()
    }
}