2021-02-25 14:28:33 +01:00
|
|
|
package com.shabinder.spotiflyer
|
2021-01-26 13:54:28 +01:00
|
|
|
|
2021-02-10 18:25:36 +01:00
|
|
|
import android.annotation.SuppressLint
|
2021-02-22 18:38:33 +01:00
|
|
|
import android.content.BroadcastReceiver
|
2021-02-10 18:25:36 +01:00
|
|
|
import android.content.Context
|
|
|
|
import android.content.Intent
|
2021-02-22 18:38:33 +01:00
|
|
|
import android.content.IntentFilter
|
2021-02-10 18:25:36 +01:00
|
|
|
import android.os.Build
|
2021-01-26 13:54:28 +01:00
|
|
|
import android.os.Bundle
|
2021-02-10 18:25:36 +01:00
|
|
|
import android.os.PowerManager
|
2021-02-22 18:38:33 +01:00
|
|
|
import android.util.Log
|
2021-02-10 18:25:36 +01:00
|
|
|
import androidx.activity.ComponentActivity
|
2021-02-11 21:51:11 +01:00
|
|
|
import androidx.activity.compose.setContent
|
2021-02-12 00:17:46 +01:00
|
|
|
import androidx.compose.material.Surface
|
2021-02-25 14:28:33 +01:00
|
|
|
import androidx.compose.runtime.*
|
2021-02-24 18:02:01 +01:00
|
|
|
import androidx.compose.ui.platform.LocalView
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
import androidx.core.view.WindowCompat
|
2021-02-22 18:38:33 +01:00
|
|
|
import androidx.lifecycle.lifecycleScope
|
2021-02-07 17:19:48 +01:00
|
|
|
import com.arkivanov.decompose.ComponentContext
|
2021-02-25 14:28:33 +01:00
|
|
|
import com.arkivanov.decompose.extensions.compose.jetbrains.rememberRootComponent
|
2021-02-07 17:19:48 +01:00
|
|
|
import com.arkivanov.mvikotlin.logging.store.LoggingStoreFactory
|
|
|
|
import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory
|
2021-02-24 22:58:02 +01:00
|
|
|
import com.razorpay.Checkout
|
|
|
|
import com.razorpay.PaymentResultListener
|
|
|
|
import com.shabinder.common.database.activityContext
|
2021-02-09 13:31:50 +01:00
|
|
|
import com.shabinder.common.di.Dir
|
|
|
|
import com.shabinder.common.di.FetchPlatformQueryResult
|
2021-02-09 20:42:01 +01:00
|
|
|
import com.shabinder.common.di.createDirectories
|
2021-02-25 14:28:33 +01:00
|
|
|
import com.shabinder.common.di.showPopUpMessage
|
2021-02-21 15:21:43 +01:00
|
|
|
import com.shabinder.common.models.DownloadStatus
|
2021-02-22 18:38:33 +01:00
|
|
|
import com.shabinder.common.models.TrackDetails
|
2021-02-07 17:19:48 +01:00
|
|
|
import com.shabinder.common.root.SpotiFlyerRoot
|
2021-02-10 18:25:36 +01:00
|
|
|
import com.shabinder.common.root.callbacks.SpotiFlyerRootCallBacks
|
2021-02-25 14:28:33 +01:00
|
|
|
import com.shabinder.common.uikit.SpotiFlyerRootContent
|
|
|
|
import com.shabinder.common.uikit.SpotiFlyerTheme
|
|
|
|
import com.shabinder.common.uikit.colorOffWhite
|
2021-02-07 17:19:48 +01:00
|
|
|
import com.shabinder.database.Database
|
2021-02-25 14:28:33 +01:00
|
|
|
import com.shabinder.spotiflyer.utils.checkIfLatestVersion
|
|
|
|
import com.shabinder.spotiflyer.utils.disableDozeMode
|
|
|
|
import com.shabinder.spotiflyer.utils.requestStoragePermission
|
2021-02-22 18:38:33 +01:00
|
|
|
import com.tonyodev.fetch2.Status
|
2021-02-10 18:25:36 +01:00
|
|
|
import kotlinx.coroutines.*
|
2021-02-22 22:42:58 +01:00
|
|
|
import kotlinx.coroutines.flow.*
|
2021-02-07 17:19:48 +01:00
|
|
|
import org.koin.android.ext.android.inject
|
2021-01-26 13:54:28 +01:00
|
|
|
|
2021-02-10 18:25:36 +01:00
|
|
|
const val disableDozeCode = 1223
|
2021-02-07 17:19:48 +01:00
|
|
|
|
2021-02-24 22:58:02 +01:00
|
|
|
class MainActivity : ComponentActivity(), PaymentResultListener {
|
2021-02-10 18:25:36 +01:00
|
|
|
|
|
|
|
private val database: Database by inject()
|
|
|
|
private val fetcher: FetchPlatformQueryResult by inject()
|
|
|
|
private val dir: Dir by inject()
|
|
|
|
private lateinit var root: SpotiFlyerRoot
|
|
|
|
private val callBacks: SpotiFlyerRootCallBacks
|
|
|
|
get() = root.callBacks
|
2021-02-22 22:42:58 +01:00
|
|
|
private val trackStatusFlow = MutableSharedFlow<HashMap<String, DownloadStatus>>(1)
|
2021-02-21 15:21:43 +01:00
|
|
|
|
2021-02-22 18:38:33 +01:00
|
|
|
private lateinit var updateUIReceiver: BroadcastReceiver
|
|
|
|
private lateinit var queryReceiver: BroadcastReceiver
|
2021-02-07 17:19:48 +01:00
|
|
|
|
2021-01-26 13:54:28 +01:00
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onCreate(savedInstanceState)
|
2021-02-24 18:02:01 +01:00
|
|
|
// This app draws behind the system bars, so we want to handle fitting system windows
|
|
|
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
|
|
|
|
2021-01-26 13:54:28 +01:00
|
|
|
setContent {
|
2021-02-07 17:19:48 +01:00
|
|
|
SpotiFlyerTheme {
|
2021-02-12 00:17:46 +01:00
|
|
|
Surface(contentColor = colorOffWhite) {
|
2021-02-24 18:02:01 +01:00
|
|
|
|
|
|
|
var statusBarHeight by remember { mutableStateOf(27.dp) }
|
|
|
|
val view = LocalView.current
|
|
|
|
|
|
|
|
LaunchedEffect(view){
|
|
|
|
view.setOnApplyWindowInsetsListener { _, insets ->
|
|
|
|
statusBarHeight = insets.systemWindowInsetTop.dp
|
|
|
|
insets
|
|
|
|
}
|
|
|
|
}
|
2021-02-25 14:28:33 +01:00
|
|
|
root = SpotiFlyerRootContent(rememberRootComponent(::spotiFlyerRoot),statusBarHeight)
|
2021-02-12 00:17:46 +01:00
|
|
|
}
|
2021-02-07 17:19:48 +01:00
|
|
|
}
|
2021-01-26 13:54:28 +01:00
|
|
|
}
|
2021-02-10 18:25:36 +01:00
|
|
|
initialise()
|
2021-01-26 13:54:28 +01:00
|
|
|
}
|
2021-02-07 17:19:48 +01:00
|
|
|
|
2021-02-10 18:25:36 +01:00
|
|
|
private fun initialise() {
|
|
|
|
checkIfLatestVersion()
|
|
|
|
requestStoragePermission()
|
|
|
|
disableDozeMode(disableDozeCode)
|
|
|
|
dir.createDirectories()
|
2021-02-24 22:58:02 +01:00
|
|
|
Checkout.preload(applicationContext)
|
2021-02-10 18:25:36 +01:00
|
|
|
}
|
2021-02-07 17:19:48 +01:00
|
|
|
|
|
|
|
private fun spotiFlyerRoot(componentContext: ComponentContext): SpotiFlyerRoot =
|
|
|
|
SpotiFlyerRoot(
|
|
|
|
componentContext,
|
|
|
|
dependencies = object : SpotiFlyerRoot.Dependencies{
|
|
|
|
override val storeFactory = LoggingStoreFactory(DefaultStoreFactory)
|
|
|
|
override val database = this@MainActivity.database
|
|
|
|
override val fetchPlatformQueryResult = this@MainActivity.fetcher
|
|
|
|
override val directories: Dir = this@MainActivity.dir
|
2021-02-22 22:42:58 +01:00
|
|
|
override val downloadProgressReport: MutableSharedFlow<HashMap<String, DownloadStatus>> = trackStatusFlow
|
2021-02-07 17:19:48 +01:00
|
|
|
}
|
|
|
|
)
|
2021-02-10 18:25:36 +01:00
|
|
|
|
|
|
|
|
|
|
|
@SuppressLint("ObsoleteSdkInt")
|
|
|
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
|
|
super.onActivityResult(requestCode, resultCode, data)
|
|
|
|
if (requestCode == disableDozeCode) {
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
|
|
val pm =
|
|
|
|
getSystemService(Context.POWER_SERVICE) as PowerManager
|
|
|
|
val isIgnoringBatteryOptimizations =
|
|
|
|
pm.isIgnoringBatteryOptimizations(packageName)
|
|
|
|
if (isIgnoringBatteryOptimizations) {
|
|
|
|
// Ignoring battery optimization
|
|
|
|
} else {
|
|
|
|
disableDozeMode(disableDozeCode)//Again Ask For Permission!!
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-22 18:38:33 +01:00
|
|
|
private fun initializeBroadcast(){
|
|
|
|
val intentFilter = IntentFilter().apply {
|
|
|
|
addAction(Status.QUEUED.name)
|
|
|
|
addAction(Status.FAILED.name)
|
|
|
|
addAction(Status.DOWNLOADING.name)
|
2021-02-22 22:42:58 +01:00
|
|
|
addAction(Status.COMPLETED.name)
|
2021-02-22 18:38:33 +01:00
|
|
|
addAction("Progress")
|
|
|
|
addAction("Converting")
|
|
|
|
}
|
|
|
|
updateUIReceiver = object : BroadcastReceiver() {
|
|
|
|
override fun onReceive(context: Context?, intent: Intent?) {
|
|
|
|
//Update Flow with latest details
|
|
|
|
if (intent != null) {
|
|
|
|
val trackDetails = intent.getParcelableExtra<TrackDetails?>("track")
|
|
|
|
trackDetails?.let { track ->
|
|
|
|
lifecycleScope.launch {
|
2021-02-22 22:42:58 +01:00
|
|
|
val latestMap = trackStatusFlow.replayCache.getOrElse(0
|
|
|
|
) { hashMapOf() }.apply {
|
2021-02-22 18:38:33 +01:00
|
|
|
this[track.title] = when (intent.action) {
|
|
|
|
Status.QUEUED.name -> DownloadStatus.Queued
|
|
|
|
Status.FAILED.name -> DownloadStatus.Failed
|
|
|
|
Status.DOWNLOADING.name -> DownloadStatus.Downloading()
|
|
|
|
"Progress" -> DownloadStatus.Downloading(intent.getIntExtra("progress", 0))
|
|
|
|
"Converting" -> DownloadStatus.Converting
|
2021-02-22 22:42:58 +01:00
|
|
|
Status.COMPLETED.name -> DownloadStatus.Downloaded
|
2021-02-22 18:38:33 +01:00
|
|
|
else -> DownloadStatus.NotDownloaded
|
|
|
|
}
|
|
|
|
}
|
2021-02-22 22:42:58 +01:00
|
|
|
trackStatusFlow.emit(latestMap)
|
|
|
|
Log.i("Track Update",track.title + track.downloaded.toString())
|
2021-02-22 18:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
val queryFilter = IntentFilter().apply { addAction("query_result") }
|
|
|
|
queryReceiver = object : BroadcastReceiver() {
|
|
|
|
override fun onReceive(context: Context?, intent: Intent?) {
|
|
|
|
//UI update here
|
|
|
|
if (intent != null){
|
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
|
val trackList = intent.getSerializableExtra("tracks") as? HashMap<String, DownloadStatus>?
|
|
|
|
trackList?.let { list ->
|
|
|
|
Log.i("Service Response", "${list.size} Tracks Active")
|
|
|
|
lifecycleScope.launch {
|
2021-02-22 22:42:58 +01:00
|
|
|
trackStatusFlow.emit(list)
|
2021-02-22 18:38:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
registerReceiver(updateUIReceiver, intentFilter)
|
|
|
|
registerReceiver(queryReceiver, queryFilter)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onResume() {
|
|
|
|
super.onResume()
|
|
|
|
initializeBroadcast()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPause() {
|
|
|
|
super.onPause()
|
|
|
|
unregisterReceiver(updateUIReceiver)
|
|
|
|
unregisterReceiver(queryReceiver)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-02-10 18:25:36 +01:00
|
|
|
override fun onNewIntent(intent: Intent?) {
|
|
|
|
super.onNewIntent(intent)
|
|
|
|
handleIntentFromExternalActivity(intent)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun handleIntentFromExternalActivity(intent: Intent? = getIntent()) {
|
|
|
|
if (intent?.action == Intent.ACTION_SEND) {
|
|
|
|
if ("text/plain" == intent.type) {
|
|
|
|
intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
|
|
|
|
val filterLinkRegex = """http.+\w""".toRegex()
|
|
|
|
val string = it.replace("\n".toRegex(), " ")
|
|
|
|
val link = filterLinkRegex.find(string)?.value.toString()
|
|
|
|
callBacks.searchLink(link)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-24 22:58:02 +01:00
|
|
|
override fun onPaymentError(errorCode: Int, response: String?) {
|
|
|
|
try{
|
|
|
|
showPopUpMessage("Payment Failed, Response:$response")
|
|
|
|
}catch (e: Exception){
|
|
|
|
Log.d("Razorpay Payment","Exception in onPaymentSuccess $response")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onPaymentSuccess(razorpayPaymentId: String?) {
|
|
|
|
try{
|
|
|
|
showPopUpMessage("Payment Successful, ThankYou!")
|
|
|
|
}catch (e: Exception){
|
|
|
|
showPopUpMessage("Razorpay Payment, Error Occurred.")
|
|
|
|
Log.d("Razorpay Payment","Exception in onPaymentSuccess, ${e.message}")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
init {
|
|
|
|
activityContext = this
|
|
|
|
}
|
2021-02-07 17:19:48 +01:00
|
|
|
}
|