diff --git a/app/build.gradle b/app/build.gradle
index 8d1a3626e4c03471e94fe54c992a8563c45337ff..9f19882cd28934f7ba3bf1348ac5d95959625e84 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -36,10 +36,15 @@ android {
androidExtensions {
experimental = true
}
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
}
dependencies {
def lifecycle_version = "1.1.1"
+ implementation 'io.sentry:sentry-android:2.1.6'
implementation 'androidx.work:work-runtime:2.3.1'
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 52792486bd659de9ed33bdffb53225e112a76f0d..a6c32551b6451bc6e51ee9aaf449479638362d63 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -29,6 +29,9 @@
android:alwaysRetainTaskState="true"
android:theme="@style/AppTheme">
+
+
+
@@ -57,6 +60,8 @@
+
+
@@ -70,5 +75,4 @@
android:windowSoftInputMode="adjustResize"
android:theme="@style/AppTheme1"/>
-
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt
index 5aadf6ec0ce4a99ab5052ea228625d308161ff61..dcaa0a62acd1205af8a887cae6de9d06bbdb5c90 100644
--- a/app/src/main/java/foundation/e/apps/MainActivity.kt
+++ b/app/src/main/java/foundation/e/apps/MainActivity.kt
@@ -25,8 +25,16 @@ import android.content.pm.PackageManager
import android.os.Bundle
import android.os.Handler
import android.preference.PreferenceManager
+import android.text.Html
+import android.text.InputFilter
+import android.view.LayoutInflater
import android.view.MenuItem
+import android.view.View
+import android.widget.CheckBox
+import android.widget.EditText
+import android.widget.LinearLayout
import android.widget.Toast
+import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
@@ -46,6 +54,12 @@ import foundation.e.apps.updates.UpdatesFragment
import foundation.e.apps.updates.UpdatesManager
import foundation.e.apps.utils.Constants
import foundation.e.apps.utils.Constants.CURRENTLY_SELECTED_FRAGMENT_KEY
+import io.sentry.android.core.SentryAndroid
+import io.sentry.android.core.SentryAndroidOptions
+import io.sentry.core.Sentry
+import io.sentry.core.SentryEvent
+import io.sentry.core.SentryLevel
+import io.sentry.core.SentryOptions.BeforeSendCallback
import kotlinx.android.synthetic.main.activity_main.*
@@ -62,7 +76,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
var doubleBackToExitPressedOnce = false;
-
companion object {
lateinit var mActivity: MainActivity
var sharedPreferences : SharedPreferences?=null
@@ -73,6 +86,15 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mActivity = this
+
+ SentryAndroid.init(this) { options: SentryAndroidOptions ->
+ options.beforeSend = BeforeSendCallback setBeforeSend@{
+ event: SentryEvent, hint: Any? -> if (SentryLevel.DEBUG == event.level) {
+ return@setBeforeSend null
+ } else
+ return@setBeforeSend event
+ }
+ }
disableCategoryIfOpenSource()
diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt
index f860a001b767bb8aa703d9a9c9225c1f1bd352e6..352abba0534c5b1c45e217ec8183d0048ea5357a 100644
--- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt
+++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt
@@ -36,9 +36,7 @@ import android.util.TypedValue
import android.view.Menu
import android.view.MenuItem
import android.view.View
-import android.widget.ImageView
-import android.widget.LinearLayout
-import android.widget.TextView
+import android.widget.*
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
@@ -47,6 +45,7 @@ import foundation.e.apps.MainActivity.Companion.sharedPreferences
import foundation.e.apps.pwa.PwaInstaller
import foundation.e.apps.R
import foundation.e.apps.application.model.Application
+import foundation.e.apps.AlertDialogs.Companion.alertInstance
import foundation.e.apps.application.model.ApplicationStateListener
import foundation.e.apps.application.model.Downloader
import foundation.e.apps.application.model.State
@@ -146,6 +145,7 @@ class ApplicationActivity :
Snackbar.make(container,
getString(error!!.description),
Snackbar.LENGTH_LONG).show()
+ alertInstance.sentryUserAlertDialog(null,"There is a parsing error", this)
// Close activity once snackbar has hidden
object : CountDownTimer(3500, 3500) {
@@ -586,14 +586,15 @@ class ApplicationActivity :
private fun onInstallButtonClick(fullData: FullData) {
// Make sure the APK is available for download
-
if (fullData.getLastVersion() == null) {
Snackbar.make(container,
getString(Error.APK_UNAVAILABLE.description),
Snackbar.LENGTH_LONG).show()
+ alertInstance.sentryUserAlertDialog(fullData.basicData.packageName,
+ resources.getString(R.string.apk_unavailable) ,
+ this)
return
}
-
application.buttonClicked(this, this)
}
@@ -618,10 +619,20 @@ class ApplicationActivity :
app_download_progress.progress = count
}
- override fun anErrorHasOccurred(error: Error) {
+ override fun anErrorHasOccurred(error: Error, fullData: FullData?) {
Snackbar.make(container,
getString(error.description),
Snackbar.LENGTH_LONG).show()
+ val err_description =error.description
+ if(err_description.toString().contains("incompatible")) {
+ alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName,
+ getString(R.string.app_incompatible_message),
+ this)
+ }else{
+ alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName,
+ getString(R.string.download_failed),
+ this)
+ }
}
override fun stateChanged(state: State) {
@@ -749,4 +760,5 @@ class ApplicationActivity :
applicationManagerServiceConnection.unbindService(this)
}
}
+
}
diff --git a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt
index 45b652e74ada5ed64a03a6e0e421986dc74e34df..d9aeec4fbc33ebe019f7be2b9afedfe280b9a616 100644
--- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt
+++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt
@@ -23,18 +23,17 @@ import android.graphics.Bitmap
import android.graphics.Color
import android.view.Gravity
import android.view.View
-import android.widget.Button
-import android.widget.ImageView
-import android.widget.RatingBar
-import android.widget.TextView
+import android.widget.*
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
+import foundation.e.apps.AlertDialogs.Companion.alertInstance
import foundation.e.apps.R
import foundation.e.apps.application.model.Application
import foundation.e.apps.application.model.ApplicationStateListener
import foundation.e.apps.application.model.Downloader
import foundation.e.apps.application.model.State
import foundation.e.apps.application.model.data.BasicData
+import foundation.e.apps.application.model.data.FullData
import foundation.e.apps.application.model.data.PwasBasicData
import foundation.e.apps.application.viewmodel.ApplicationViewModel
import foundation.e.apps.utils.Common
@@ -78,6 +77,9 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi
Snackbar.make(view, activity.getString(
Error.APK_UNAVAILABLE.description),
Snackbar.LENGTH_LONG).show()
+ alertInstance.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName,
+ view.context.resources.getString(R.string.apk_unavailable),
+ view.context)
} else if(application?.pwabasicdata!=null){
application?.pwaInstall(activity)
@@ -188,10 +190,20 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi
installButton.setBackgroundResource(R.drawable.app_installing_border_simple)
}
- override fun anErrorHasOccurred(error: Error) {
+ override fun anErrorHasOccurred(error: Error, fullData: FullData?) {
Snackbar.make(activity.findViewById(R.id.container),
activity.getString(error.description),
Snackbar.LENGTH_LONG).show()
+ val err_description =error.description
+ if(err_description.toString().contains("incompatible")) {
+ alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName,
+ view.context.resources.getString(R.string.app_incompatible_message),
+ view.context )
+ }else{
+ alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName,
+ view.context.resources.getString(R.string.download_failed),
+ view.context)
+ }
}
fun onViewRecycled() {
@@ -199,3 +211,5 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi
downloader = null
}
}
+
+
diff --git a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt
index 20c5d129cdd3b4da9b7b1fb320cb7407cad83907..0b2f46c0290780ea20d33d541d58a8b61d5fd6fb 100644
--- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt
+++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt
@@ -30,12 +30,14 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
+import foundation.e.apps.AlertDialogs.Companion.alertInstance
import foundation.e.apps.R
import foundation.e.apps.application.model.Application
import foundation.e.apps.application.model.ApplicationStateListener
import foundation.e.apps.application.model.Downloader
import foundation.e.apps.application.model.State
import foundation.e.apps.application.model.data.BasicData
+import foundation.e.apps.application.model.data.FullData
import foundation.e.apps.application.model.data.PwasBasicData
import foundation.e.apps.application.viewmodel.ApplicationViewModel
import foundation.e.apps.utils.Common
@@ -73,6 +75,9 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
Snackbar.make(view, activity.getString(
Error.APK_UNAVAILABLE.description),
Snackbar.LENGTH_LONG).show()
+ alertInstance.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName,
+ view.context.resources.getString(R.string.apk_unavailable) ,
+ view.context)
}
else if(application?.pwabasicdata!=null){
application?.pwaInstall(activity)
@@ -169,11 +174,20 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie
installButton.startAnimation(anim)
}
- override fun anErrorHasOccurred(error: Error) {
+ override fun anErrorHasOccurred(error: Error, fullData: FullData?) {
Snackbar.make(activity.findViewById(R.id.container),
activity.getString(error.description),
Snackbar.LENGTH_LONG).show()
-
+ val err_description =error.description
+ if(err_description.toString().contains("incompatible")) {
+ alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName,
+ view.context.resources.getString(R.string.app_incompatible_message),
+ view.context )
+ }else{
+ alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName,
+ view.context.resources.getString(R.string.download_failed),
+ view.context)
+ }
}
fun onViewRecycled() {
diff --git a/app/src/main/java/foundation/e/apps/application/model/AlertDialog.kt b/app/src/main/java/foundation/e/apps/application/model/AlertDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7d0ef95b989279eecceac123c7f31eba9147cbc9
--- /dev/null
+++ b/app/src/main/java/foundation/e/apps/application/model/AlertDialog.kt
@@ -0,0 +1,123 @@
+/*
+ Copyright (C) 2019 e Foundation
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+ */
+
+package foundation.e.apps
+
+
+import android.content.*
+import android.os.Bundle
+import android.text.Html
+import android.text.InputFilter
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.CheckBox
+import android.widget.EditText
+import android.widget.LinearLayout
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import io.sentry.core.Sentry
+
+
+class AlertDialogs {
+
+ val PREFS_NAME = "MyPrefsFile1"
+ var dontShowAgain: CheckBox? = null
+
+ private object HOLDER {
+ val INSTANCE = AlertDialogs()
+ }
+
+ companion object {
+ val alertInstance: AlertDialogs by lazy { HOLDER.INSTANCE }
+ }
+
+ @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
+ fun sentryUserAlertDialog(packageName: String?, error: String?, context: Context?) {
+
+ val adb = AlertDialog.Builder(context!!)
+ val layout = LinearLayout(context)
+ layout.orientation = LinearLayout.VERTICAL
+
+ val edittext = EditText(context)
+ edittext.hint=context.getString(R.string.edittext_hint)
+ edittext.filters = arrayOf(InputFilter.LengthFilter(600))
+
+ val adbInflater = LayoutInflater.from(context)
+ val eulaLayout = adbInflater.inflate(R.layout.checkbox, null)
+
+ val settings: SharedPreferences = context.getSharedPreferences(PREFS_NAME, 0)
+ val skipMessage: String = settings.getString("skipMessage", "NOT checked")
+ val userConfirmation: String = settings.getString("userConfirmation", "No")
+
+
+ dontShowAgain = eulaLayout.findViewById(R.id.skip) as CheckBox
+ layout.addView(edittext)
+ layout.addView(eulaLayout)
+ val title =context.getString(R.string.edittext_title)
+ adb.setTitle("$title $error")
+
+ adb.setMessage(Html.fromHtml(context.getString(R.string.edittext_messege)))
+ adb.setView(layout)
+
+
+ adb.setPositiveButton("yes", DialogInterface.OnClickListener { dialog, which ->
+ var checkBoxResult = "NOT checked"
+ var userConfirmation =""
+ val checkbox =dontShowAgain
+ if (checkbox!!.isChecked()) {
+ checkBoxResult = "checked"
+ userConfirmation ="yes"
+ }
+ val settings: SharedPreferences = context.getSharedPreferences(PREFS_NAME, 0)
+ val editor: SharedPreferences.Editor = settings.edit()
+ editor.putString("skipMessage", checkBoxResult)
+ editor.putString("userConfirmation",userConfirmation)
+ editor.commit()
+ // Do what you want to do on "OK" action
+ Sentry.captureMessage(edittext.text.toString())
+ return@OnClickListener
+ })
+
+
+ adb.setNegativeButton("no", DialogInterface.OnClickListener { dialog, which ->
+ var checkBoxResult = "NOT checked"
+ var userConfirmation =""
+ val checkbox =dontShowAgain
+ if (checkbox!!.isChecked()) {
+ checkBoxResult = "checked"
+ userConfirmation ="no"
+ }
+ val settings: SharedPreferences = context.getSharedPreferences(PREFS_NAME, 0)
+ val editor: SharedPreferences.Editor = settings.edit()
+ editor.putString("skipMessage", checkBoxResult)
+ editor.putString("userConfirmation",userConfirmation)
+ editor.commit()
+ // Do what you want to do on "CANCEL" action
+ return@OnClickListener
+ })
+
+ if (skipMessage != "checked") {
+ adb.show()
+ }
+ else if(skipMessage == "checked" && userConfirmation =="yes"){
+ if(packageName !=null)
+ Sentry.captureMessage("$error $packageName");
+ else
+ Sentry.captureMessage("Parsing error - something went wrong");
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/foundation/e/apps/application/model/Application.kt b/app/src/main/java/foundation/e/apps/application/model/Application.kt
index 131ca0c8457f4fba3b1f166dc7832de508d2cd2e..2ce62ad3e9e0b8409047179f8e7f661e912f2135 100644
--- a/app/src/main/java/foundation/e/apps/application/model/Application.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/Application.kt
@@ -109,8 +109,6 @@ class Application(val packageName: String, private val applicationManager: Appli
intent.putExtra("NAME",pwaFullData!!.name)
intent.putExtra("URL",pwaFullData!!.url)
context.startActivity(intent)
- } else {
- stateManager.notifyError(error!!)
}
}
})
@@ -175,11 +173,11 @@ class Application(val packageName: String, private val applicationManager: Appli
blocker.wait()
}
} else {
- stateManager.notifyError(Error.APK_INCOMPATIBLE)
+ stateManager.notifyError(Error.APK_INCOMPATIBLE,fullData)
onDownloadComplete(context, DownloadManager.STATUS_FAILED)
}
} else {
- stateManager.notifyError(error)
+ stateManager.notifyError(error, fullData)
onDownloadComplete(context, DownloadManager.STATUS_FAILED)
}
}
@@ -329,7 +327,7 @@ class Application(val packageName: String, private val applicationManager: Appli
}
var error: Error? = null
if (Common.isNetworkAvailable(context)) {
- AppDetailRequest(searchAppsBasicData!!.id).request { applicationError, fullData->
+ AppDetailRequest(searchAppsBasicData!!.id ).request { applicationError, fullData->
when (applicationError) {
null -> {
error = Error.NO_RESULTS
diff --git a/app/src/main/java/foundation/e/apps/application/model/ApplicationStateListener.kt b/app/src/main/java/foundation/e/apps/application/model/ApplicationStateListener.kt
index 9f6cfcee64af87dbec231aed8c2cbc5bd3554a2e..291c938f8cdb781b8b380316812beff3c1fa6071 100644
--- a/app/src/main/java/foundation/e/apps/application/model/ApplicationStateListener.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/ApplicationStateListener.kt
@@ -17,6 +17,7 @@
package foundation.e.apps.application.model
+import foundation.e.apps.application.model.data.FullData
import foundation.e.apps.utils.Error
interface ApplicationStateListener {
@@ -25,6 +26,6 @@ interface ApplicationStateListener {
fun downloading(downloader: Downloader)
- fun anErrorHasOccurred(error: Error)
+ fun anErrorHasOccurred(error: Error, fullData: FullData?)
}
diff --git a/app/src/main/java/foundation/e/apps/application/model/StateManager.kt b/app/src/main/java/foundation/e/apps/application/model/StateManager.kt
index 556db86b1168998adc87c4935e3b497b0ac5cd42..62d4c89aab8596a4aeca119772bf772fb2d22b73 100644
--- a/app/src/main/java/foundation/e/apps/application/model/StateManager.kt
+++ b/app/src/main/java/foundation/e/apps/application/model/StateManager.kt
@@ -19,6 +19,7 @@ package foundation.e.apps.application.model
import android.content.Context
import foundation.e.apps.application.model.data.BasicData
+import foundation.e.apps.application.model.data.FullData
import foundation.e.apps.application.model.data.SearchAppsBasicData
import foundation.e.apps.applicationmanager.ApplicationManager
import foundation.e.apps.utils.Error
@@ -99,9 +100,9 @@ class StateManager(private val info: ApplicationInfo, private val app: Applicati
}
}
- fun notifyError(error: Error) {
+ fun notifyError(error: Error, fullData: FullData?) {
listeners.forEach { listener: ApplicationStateListener ->
- listener.anErrorHasOccurred(error)
+ listener.anErrorHasOccurred(error,fullData)
}
}
diff --git a/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt b/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt
index b8ce442a8b4a3ece6bb57ee377b59b7024d6ba74..87c9119ae40fedfff7c1f119a32bb2c69d087dd2 100644
--- a/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt
+++ b/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt
@@ -19,6 +19,7 @@ package foundation.e.apps.categories.category.model
import android.content.Context
import androidx.lifecycle.MutableLiveData
+import foundation.e.apps.AlertDialogs.Companion.alertInstance
import foundation.e.apps.MainActivity
import foundation.e.apps.api.ListApplicationsRequest
import foundation.e.apps.api.ListPwasRequest
@@ -59,6 +60,7 @@ class CategoryModel : CategoryModelInterface {
categoryApplicationsList.value = result
}
} else {
+ alertInstance.sentryUserAlertDialog(null,"There is a parsing error",context)
screenError.value = error
}
})
diff --git a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt
index 723df4b79261345e76dde591803b5697d49e8e35..e43b6c74e89ef32f516d42f08a4b5300c9ea6e91 100644
--- a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt
+++ b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt
@@ -32,6 +32,7 @@ import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager.widget.ViewPager
+import foundation.e.apps.AlertDialogs.Companion.alertInstance
import foundation.e.apps.R
import foundation.e.apps.application.model.Application
import foundation.e.apps.applicationmanager.ApplicationManager
@@ -111,6 +112,7 @@ class HomeFragment : Fragment() {
errorDescription.text = activity!!.getString(it.description)
errorContainer.visibility = View.VISIBLE
progressBar.visibility = View.GONE
+ alertInstance.sentryUserAlertDialog(null,"There is a parsing error", context)
} else {
errorContainer.visibility = View.GONE
}
diff --git a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt
index 7f4922b279a73f9404f015cdf19c3b2ae4ddbfbc..d355529b9846951cf518af15b49a2e1795caa81d 100644
--- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt
+++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt
@@ -34,6 +34,7 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import foundation.e.apps.AlertDialogs.Companion.alertInstance
import foundation.e.apps.R
import foundation.e.apps.application.model.Application
import foundation.e.apps.applicationmanager.ApplicationManager
@@ -156,6 +157,8 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On
errorContainer.visibility = View.VISIBLE
progressBar.visibility = View.GONE
loadMoreContainer.visibility = View.GONE
+ alertInstance.sentryUserAlertDialog(null,"There is a parsing error", context)
+
} else {
loadMoreContainer.visibility = View.GONE
isLoadingMoreApplications = false
diff --git a/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt b/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt
index 63d01dd44632ca2a0aa82eec05f16dd566b54eea..31ae8cdfeff4a739fb29036658382c909860f111 100644
--- a/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt
+++ b/app/src/main/java/foundation/e/apps/search/model/SearchModel.kt
@@ -20,6 +20,9 @@ package foundation.e.apps.search.model
import android.content.Context
import android.os.AsyncTask
import androidx.lifecycle.MutableLiveData
+import foundation.e.apps.AlertDialogs
+import foundation.e.apps.MainActivity
+import foundation.e.apps.MainActivity.Companion.mActivity
import foundation.e.apps.application.model.Application
import foundation.e.apps.applicationmanager.ApplicationManager
import foundation.e.apps.utils.Common
diff --git a/app/src/main/java/foundation/e/apps/utils/Error.kt b/app/src/main/java/foundation/e/apps/utils/Error.kt
index 312cacc5ef8271c1504b1ccb6c3b02eb85f2abcd..8d451356ab6acf45eec9294c9e21ef70b51ed715 100644
--- a/app/src/main/java/foundation/e/apps/utils/Error.kt
+++ b/app/src/main/java/foundation/e/apps/utils/Error.kt
@@ -41,6 +41,7 @@ enum class Error(val description: Int) {
CustomException::class -> (e as CustomException).error
SocketTimeoutException::class -> return REQUEST_TIMEOUT
IOException::class -> return SERVER_UNAVAILABLE
+ java.net.UnknownHostException::class -> return NO_INTERNET
else -> UNKNOWN
}
}
diff --git a/app/src/main/res/layout/checkbox.xml b/app/src/main/res/layout/checkbox.xml
new file mode 100644
index 0000000000000000000000000000000000000000..22dc46b4c8bd3d329ab521fb63ce95d7f2a7d17a
--- /dev/null
+++ b/app/src/main/res/layout/checkbox.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e8a17b08a116fceeb062b33141c3591396a4b044..8a1539e39ab9b739ad9806eded2d3bdce957ca88 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -175,4 +175,15 @@
Tap here to retry!
PWA
+
+ Write Something for developers....
+ Oops!
+ We are sorry! Do you want to report this issue?
+ Never ask
+ app is incompatible with your device
+ Download Failed
+ APK UNAVAILABLE
+
+
+
diff --git a/build.gradle b/build.gradle
index 94b22f3c7e257f76ac7fe9a6e1a12b9ab0a0aa06..8f996099ad8e954b8945e7032ac5390dc81dcf26 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,10 +5,12 @@ buildscript {
repositories {
google()
jcenter()
+ mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath 'io.sentry:sentry-android-gradle-plugin:1.7.34'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files