Self Hosted Acra Crashlytics, Removed Firebase and Razorpay sdk for F-DROID

This commit is contained in:
shabinder 2021-05-12 04:00:52 +05:30
parent 8f7bc00801
commit dad897aa76
8 changed files with 65 additions and 70 deletions

View File

@ -14,6 +14,7 @@
* * along with this program. If not, see <https://www.gnu.org/licenses/>. * * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import Extras.Android.Acra
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import org.jetbrains.compose.compose import org.jetbrains.compose.compose
@ -22,9 +23,6 @@ plugins {
kotlin("android") kotlin("android")
id("kotlin-parcelize") id("kotlin-parcelize")
id("org.jetbrains.compose") id("org.jetbrains.compose")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
id("com.google.firebase.firebase-perf")
} }
group = "com.shabinder" group = "com.shabinder"
@ -32,6 +30,10 @@ version = Versions.versionName
repositories { repositories {
google() google()
mavenCentral()
// Remove jcenter as soon as following issue closes
// https://github.com/matomo-org/matomo-sdk-android/issues/301
jcenter()
} }
android { android {
@ -126,13 +128,15 @@ dependencies {
// Extras // Extras
Extras.Android.apply { Extras.Android.apply {
implementation(Acra.notification)
implementation(Acra.http)
implementation(appUpdator) implementation(appUpdator)
implementation(razorpay) implementation(matomo)
} }
implementation("dev.icerock.moko:parcelize:0.6.1") implementation("dev.icerock.moko:parcelize:0.6.1")
implementation("com.github.shabinder:storage-chooser:2.0.4.45") implementation("com.github.shabinder:storage-chooser:2.0.4.45")
implementation("com.google.accompanist:accompanist-insets:0.9.0") implementation("com.google.accompanist:accompanist-insets:0.9.1")
// Test // Test
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")

View File

@ -17,8 +17,14 @@
package com.shabinder.spotiflyer package com.shabinder.spotiflyer
import android.app.Application import android.app.Application
import android.content.Context
import com.shabinder.common.di.initKoin import com.shabinder.common.di.initKoin
import com.shabinder.spotiflyer.di.appModule import com.shabinder.spotiflyer.di.appModule
import org.acra.config.httpSender
import org.acra.config.notification
import org.acra.data.StringFormat
import org.acra.ktx.initAcra
import org.acra.sender.HttpSender
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger import org.koin.android.ext.koin.androidLogger
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
@ -29,11 +35,42 @@ class App: Application(), KoinComponent {
super.onCreate() super.onCreate()
val loggingEnabled = true val loggingEnabled = true
// KOIN - DI
initKoin(loggingEnabled) { initKoin(loggingEnabled) {
androidLogger(Level.NONE) // No virtual method elapsedNow androidLogger(Level.NONE) // No virtual method elapsedNow
androidContext(this@App) androidContext(this@App)
modules(appModule(loggingEnabled)) modules(appModule(loggingEnabled))
} }
} }
@Suppress("SpellCheckingInspection")
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
// Crashlytics
initAcra {
buildConfigClass = BuildConfig::class.java
reportFormat = StringFormat.JSON
/*
* Prompt User Before Sending Any Crash Report
* Obeying `F-Droid Inclusion Privacy Rules`
* */
notification {
title = getString(R.string.acra_notification_title)
text = getString(R.string.acra_notification_text)
channelName = getString(R.string.acra_notification_channel)
channelDescription = getString(R.string.acra_notification_channel_desc)
sendOnClick = true
}
// Send Crash Report to self hosted Acrarium (FOSS)
httpSender {
uri = "https://kind-grasshopper-73.telebit.io/acrarium/report"
basicAuthLogin = "sDj2xCKQIxw0dujf"
basicAuthPassword = "O83du0TsgsDJ69zN"
httpMethod = HttpSender.Method.POST
connectionTimeout = 15000
socketTimeout = 20000
compress = true
}
}
}
} }

View File

@ -17,7 +17,6 @@
package com.shabinder.spotiflyer package com.shabinder.spotiflyer
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -51,12 +50,9 @@ import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.navigationBarsPadding import com.google.accompanist.insets.navigationBarsPadding
import com.google.accompanist.insets.statusBarsHeight import com.google.accompanist.insets.statusBarsHeight
import com.google.accompanist.insets.statusBarsPadding import com.google.accompanist.insets.statusBarsPadding
import com.razorpay.Checkout
import com.razorpay.PaymentResultListener
import com.shabinder.common.di.* import com.shabinder.common.di.*
import com.shabinder.common.di.worker.ForegroundService import com.shabinder.common.di.worker.ForegroundService
import com.shabinder.common.models.Actions import com.shabinder.common.models.Actions
import com.shabinder.common.models.AllPlatforms
import com.shabinder.common.models.DownloadStatus import com.shabinder.common.models.DownloadStatus
import com.shabinder.common.models.PlatformActions import com.shabinder.common.models.PlatformActions
import com.shabinder.common.models.PlatformActions.Companion.SharedPreferencesKey import com.shabinder.common.models.PlatformActions.Companion.SharedPreferencesKey
@ -71,14 +67,13 @@ import com.shabinder.spotiflyer.ui.NetworkDialog
import com.shabinder.spotiflyer.ui.PermissionDialog import com.shabinder.spotiflyer.ui.PermissionDialog
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import org.json.JSONObject
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.io.File import java.io.File
const val disableDozeCode = 1223 const val disableDozeCode = 1223
@ExperimentalAnimationApi @ExperimentalAnimationApi
class MainActivity : ComponentActivity(), PaymentResultListener { class MainActivity : ComponentActivity() {
private val fetcher: FetchPlatformQueryResult by inject() private val fetcher: FetchPlatformQueryResult by inject()
private val dir: Dir by inject() private val dir: Dir by inject()
@ -134,7 +129,6 @@ class MainActivity : ComponentActivity(), PaymentResultListener {
private fun initialise() { private fun initialise() {
checkIfLatestVersion() checkIfLatestVersion()
Checkout.preload(applicationContext)
handleIntentFromExternalActivity() handleIntentFromExternalActivity()
} }
@ -237,12 +231,8 @@ class MainActivity : ComponentActivity(), PaymentResultListener {
} }
override fun giveDonation() { override fun giveDonation() {
try {
startPayment(this@MainActivity)
}catch (e:Exception) {
openPlatform("",platformLink = "https://razorpay.com/payment-button/pl_GnKuuDBdBu0ank/view/?utm_source=payment_button&utm_medium=button&utm_campaign=payment_button") openPlatform("",platformLink = "https://razorpay.com/payment-button/pl_GnKuuDBdBu0ank/view/?utm_source=payment_button&utm_medium=button&utm_campaign=payment_button")
} }
}
override fun shareApp() { override fun shareApp() {
val sendIntent: Intent = Intent().apply { val sendIntent: Intent = Intent().apply {
@ -390,50 +380,4 @@ class MainActivity : ComponentActivity(), PaymentResultListener {
} }
} }
} }
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}")
}
}
/*
* RazorPay Payment
* */
private fun startPayment(mainActivity: Activity) {
val co = Checkout().apply {
setKeyID("rzp_live_3ZQeoFYOxjmXye")
setImage(com.shabinder.common.di.R.drawable.ic_spotiflyer_logo)
}
try {
val preFill = JSONObject()
val options = JSONObject().apply {
put("name", "SpotiFlyer")
put("description", "Thanks For the Donation!")
// You can omit the image option to fetch the image from dashboard
// put("image","https://github.com/Shabinder/SpotiFlyer/raw/master/app/SpotifyDownload.png")
put("currency", "INR")
put("amount", "4900")
put("prefill", preFill)
}
co.open(mainActivity, options)
} catch (e: Exception) {
// showPop("Error in payment: "+ e.message)
e.printStackTrace()
}
}
} }

View File

@ -30,4 +30,8 @@
<string name="share_subtitle">Share this app with your friends and family.</string> <string name="share_subtitle">Share this app with your friends and family.</string>
<string name="made_with_love">Made with</string> <string name="made_with_love">Made with</string>
<string name="in_india">in India</string> <string name="in_india">in India</string>
<string name="acra_notification_title">OOPS, SpotiFlyer Crashed</string>
<string name="acra_notification_text">Please Send Crash Report to App Developers, So this unfortunate event may not happen again.</string>
<string name="acra_notification_channel">SpotiFlyer_Crashlytics</string>
<string name="acra_notification_channel_desc">Notification Channel to send Spotiflyer Crashes.</string>
</resources> </resources>

View File

@ -32,9 +32,6 @@ repositories {
dependencies { dependencies {
implementation("com.android.tools.build:gradle:4.2.0") implementation("com.android.tools.build:gradle:4.2.0")
implementation("com.google.gms:google-services:4.3.5")
implementation("com.google.firebase:perf-plugin:1.3.5")
implementation("com.google.firebase:firebase-crashlytics-gradle:2.5.2")
implementation("org.jlleitschuh.gradle:ktlint-gradle:${Versions.ktLint}") implementation("org.jlleitschuh.gradle:ktlint-gradle:${Versions.ktLint}")
implementation(JetBrains.Compose.gradlePlugin) implementation(JetBrains.Compose.gradlePlugin)
implementation(JetBrains.Kotlin.gradlePlugin) implementation(JetBrains.Kotlin.gradlePlugin)

View File

@ -142,8 +142,14 @@ object Extras {
const val jaudioTagger = "com.github.Shabinder:JAudioTagger-Android:1.0" const val jaudioTagger = "com.github.Shabinder:JAudioTagger-Android:1.0"
const val kermit = "co.touchlab:kermit:${Versions.kermit}" const val kermit = "co.touchlab:kermit:${Versions.kermit}"
object Android { object Android {
val razorpay = "com.razorpay:checkout:1.6.7" object Acra {
val fetch = "androidx.tonyodev.fetch2:xfetch2:3.1.6" // Self Hosted Crashlytics (FOSS)
private const val VERSION = "5.8.1-beta11"
val http = "ch.acra:acra-http:$VERSION"
val notification = "ch.acra:acra-notification:$VERSION"
}
// Self Hosted Analytics (FOSS)
val matomo = "org.matomo.sdk:tracker:4.1.2"
val appUpdator = "com.github.amitbd1508:AppUpdater:4.1.0" val appUpdator = "com.github.amitbd1508:AppUpdater:4.1.0"
} }
} }

View File

@ -40,7 +40,6 @@ kotlin {
androidMain { androidMain {
dependencies { dependencies {
implementation(compose.materialIconsExtended) implementation(compose.materialIconsExtended)
implementation(Extras.Android.razorpay)
implementation(Extras.mp3agic) implementation(Extras.mp3agic)
implementation("com.github.shabinder:storage-chooser:2.0.4.45") implementation("com.github.shabinder:storage-chooser:2.0.4.45")
// implementation(files("$rootDir/libs/mobile-ffmpeg.aar")) // implementation(files("$rootDir/libs/mobile-ffmpeg.aar"))

View File

@ -31,6 +31,7 @@ kotlin {
kotlinOptions.jvmTarget = "14" kotlinOptions.jvmTarget = "14"
} }
} }
sourceSets { sourceSets {
val jvmMain by getting { val jvmMain by getting {
dependencies { dependencies {
@ -40,6 +41,7 @@ kotlin {
implementation(project(":common:compose")) implementation(project(":common:compose"))
implementation(project(":common:data-models")) implementation(project(":common:data-models"))
implementation(project(":common:root")) implementation(project(":common:root"))
// Decompose // Decompose
implementation(Decompose.decompose) implementation(Decompose.decompose)
implementation(Decompose.extensionsCompose) implementation(Decompose.extensionsCompose)
@ -66,8 +68,10 @@ compose.desktop {
packageName = "SpotiFlyer" packageName = "SpotiFlyer"
copyright = "© 2021 Shabinder. All rights reserved." copyright = "© 2021 Shabinder. All rights reserved."
vendor = "Shabinder" vendor = "Shabinder"
val iconsRoot = project.file("src/jvmMain/resources/drawable") val iconsRoot = project.file("src/jvmMain/resources/drawable")
macOS { macOS {
bundleID = "com.shabinder.spotiflyer"
iconFile.set(iconsRoot.resolve("spotiflyer.icns")) iconFile.set(iconsRoot.resolve("spotiflyer.icns"))
} }
windows { windows {