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