From 03b8da8a17bea76477cdc61d346790d21d22b6b1 Mon Sep 17 00:00:00 2001 From: Dayona Joseph Date: Tue, 23 Jun 2020 12:49:03 +0530 Subject: [PATCH 1/6] Sentry integration --- app/build.gradle | 5 + app/src/main/AndroidManifest.xml | 4 +- .../java/foundation/e/apps/MainActivity.kt | 113 ++++++++++++++++++ .../e/apps/application/ApplicationActivity.kt | 17 ++- .../apps/application/ApplicationViewHolder.kt | 18 ++- .../application/SmallApplicationViewHolder.kt | 12 +- .../e/apps/application/model/Application.kt | 8 +- .../model/ApplicationStateListener.kt | 3 +- .../e/apps/application/model/StateManager.kt | 5 +- app/src/main/res/layout/checkbox.xml | 15 +++ app/src/main/res/values/strings.xml | 8 ++ build.gradle | 2 + 12 files changed, 188 insertions(+), 22 deletions(-) create mode 100644 app/src/main/res/layout/checkbox.xml diff --git a/app/build.gradle b/app/build.gradle index e43bb0af6..002a0a838 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 1a6718172..b7817431c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,9 @@ android:launchMode="singleTask" android:theme="@style/AppTheme"> + + + @@ -67,5 +70,4 @@ android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" /> - \ 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 9774b8bb4..bd22178f2 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -19,13 +19,23 @@ package foundation.e.apps //import androidx.fragment.app.ListFragment import android.annotation.SuppressLint +import android.content.Context +import android.content.DialogInterface import android.content.SharedPreferences 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.fragment.app.Fragment import com.google.android.material.bottomnavigation.BottomNavigationItemView @@ -33,6 +43,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationMenuView import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.LabelVisibilityMode import com.google.android.material.snackbar.Snackbar +import foundation.e.apps.application.model.data.FullData import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnection import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnectionCallback @@ -44,6 +55,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.* @@ -58,6 +75,8 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS ApplicationManagerServiceConnection(this) private val codeRequestPermissions = 9527 var doubleBackToExitPressedOnce = false; + val PREFS_NAME = "MyPrefsFile1" + var dontShowAgain: CheckBox? = null @@ -71,6 +90,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() @@ -244,4 +272,89 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } }, 2000) } + + @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") + fun sentryUserAlertDialog(fullData: FullData?, error: String?, context: Context) { + + val adb = AlertDialog.Builder(context) + var YouEditTextValue="" + val layout = LinearLayout(context) + layout.orientation = LinearLayout.VERTICAL + + val edittext = EditText(context) + edittext.hint=getString(R.string.edittext_hint) + edittext.setFilters(arrayOf(InputFilter.LengthFilter(600))) + + val adbInflater = LayoutInflater.from(context) + val eulaLayout = adbInflater.inflate(R.layout.checkbox, null) + + val settings: SharedPreferences = 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) + if(error!=null){ + val title =getString(R.string.edittext_title) + adb.setTitle("$title $error") + }else{ + adb.setTitle(getString(R.string.edittext_title)) + } + adb.setMessage(Html.fromHtml(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 = 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 + YouEditTextValue = edittext.text.toString() + Sentry.captureMessage(YouEditTextValue) + 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 = 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(error !=null){ + val name = fullData!!.basicData.packageName + Sentry.captureMessage("$error $name"); + } + 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/ApplicationActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt index 2c51e6907..4ae2dbc97 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -36,13 +36,12 @@ 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 import com.google.android.material.snackbar.Snackbar +import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.MainActivity.Companion.sharedPreferences import foundation.e.apps.PWA.PwaInstaller import foundation.e.apps.R @@ -586,14 +585,13 @@ 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() + mActivity.sentryUserAlertDialog(fullData, "APK_UNAVAILABLE",this) return } - application.buttonClicked(this, this) } @@ -618,10 +616,16 @@ 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")) { + mActivity.sentryUserAlertDialog(fullData!!, "app is incompatible with your device", this) + }else{ + mActivity.sentryUserAlertDialog(fullData!!, "Download Failed", this) + } } override fun stateChanged(state: State) { @@ -749,4 +753,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 45b652e74..34400df84 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.MainActivity.Companion.mActivity 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,7 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() + mActivity.sentryUserAlertDialog(application!!.fullData!!, "APK_UNAVAILABLE", view.context) } else if(application?.pwabasicdata!=null){ application?.pwaInstall(activity) @@ -188,10 +188,16 @@ 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")) { + mActivity.sentryUserAlertDialog(fullData!!, "app is incompatible with your device",view.context ) + }else{ + mActivity.sentryUserAlertDialog(fullData!!, "Download Failed", view.context) + } } fun onViewRecycled() { @@ -199,3 +205,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 20c5d129c..4217b520e 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.MainActivity.Companion.mActivity 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,7 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() + mActivity.sentryUserAlertDialog(application!!.fullData!!, "APK_UNAVAILABLE", view.context) } else if(application?.pwabasicdata!=null){ application?.pwaInstall(activity) @@ -169,11 +172,16 @@ 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")) { + mActivity.sentryUserAlertDialog(fullData!!, "app is incompatible with your device",view.context ) + }else{ + mActivity.sentryUserAlertDialog(fullData!!, "Download Failed", view.context) + } } fun onViewRecycled() { 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 a7665b29c..94e42d08d 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) } } @@ -330,7 +328,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 9f6cfcee6..291c938f8 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 556db86b1..62d4c89aa 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/res/layout/checkbox.xml b/app/src/main/res/layout/checkbox.xml new file mode 100644 index 000000000..22dc46b4c --- /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 d64cfde01..92ec6baec 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -175,4 +175,12 @@ Tap here to retry! PWA + + Write Something for developers.... + Oops! + We are sorry! Do you want to report this issue? + Never ask + + + diff --git a/build.gradle b/build.gradle index 133f43fd2..ef2af56ff 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 -- GitLab From 9d0f345f33a72532467a36a92824e6ea5e76cd35 Mon Sep 17 00:00:00 2001 From: Dayona Joseph Date: Tue, 23 Jun 2020 14:14:46 +0530 Subject: [PATCH 2/6] Add translations --- .../foundation/e/apps/application/ApplicationActivity.kt | 6 +++--- .../foundation/e/apps/application/ApplicationViewHolder.kt | 6 +++--- .../e/apps/application/SmallApplicationViewHolder.kt | 6 +++--- app/src/main/res/values/strings.xml | 3 +++ 4 files changed, 12 insertions(+), 9 deletions(-) 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 4ae2dbc97..0891fb5cf 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -589,7 +589,7 @@ class ApplicationActivity : Snackbar.make(container, getString(Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(fullData, "APK_UNAVAILABLE",this) + mActivity.sentryUserAlertDialog(fullData, (R.string.apk_unavailable).toString() ,this) return } application.buttonClicked(this, this) @@ -622,9 +622,9 @@ class ApplicationActivity : Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!, "app is incompatible with your device", this) + mActivity.sentryUserAlertDialog(fullData!!, getString(R.string.app_incompatible_message), this) }else{ - mActivity.sentryUserAlertDialog(fullData!!, "Download Failed", this) + mActivity.sentryUserAlertDialog(fullData!!, getString(R.string.download_failed), 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 34400df84..00abcf17d 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -77,7 +77,7 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(application!!.fullData!!, "APK_UNAVAILABLE", view.context) + mActivity.sentryUserAlertDialog(application!!.fullData!!,(R.string.apk_unavailable).toString() , view.context) } else if(application?.pwabasicdata!=null){ application?.pwaInstall(activity) @@ -194,9 +194,9 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!, "app is incompatible with your device",view.context ) + mActivity.sentryUserAlertDialog(fullData!!, (R.string.app_incompatible_message).toString(),view.context ) }else{ - mActivity.sentryUserAlertDialog(fullData!!, "Download Failed", view.context) + mActivity.sentryUserAlertDialog(fullData!!, (R.string.download_failed).toString(), view.context) } } 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 4217b520e..06671dd3a 100644 --- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt @@ -75,7 +75,7 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(application!!.fullData!!, "APK_UNAVAILABLE", view.context) + mActivity.sentryUserAlertDialog(application!!.fullData!!, (R.string.apk_unavailable).toString() , view.context) } else if(application?.pwabasicdata!=null){ application?.pwaInstall(activity) @@ -178,9 +178,9 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!, "app is incompatible with your device",view.context ) + mActivity.sentryUserAlertDialog(fullData!!, (R.string.app_incompatible_message).toString(),view.context ) }else{ - mActivity.sentryUserAlertDialog(fullData!!, "Download Failed", view.context) + mActivity.sentryUserAlertDialog(fullData!!, (R.string.download_failed).toString(), view.context) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 92ec6baec..91e8da93c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,6 +180,9 @@ Oops! We are sorry! Do you want to report this issue? Never ask + app is incompatible with your device + Download Failed + APK UNAVAILABLE -- GitLab From 37cfdaa6e72d63afcd846d27b96dac83c7709a7b Mon Sep 17 00:00:00 2001 From: Dayona Joseph Date: Mon, 10 Aug 2020 12:22:09 +0530 Subject: [PATCH 3/6] Sentry track more errors --- .../java/foundation/e/apps/MainActivity.kt | 28 ++++++------------- .../e/apps/application/ApplicationActivity.kt | 13 +++++++-- .../apps/application/ApplicationViewHolder.kt | 12 ++++++-- .../application/SmallApplicationViewHolder.kt | 12 ++++++-- .../category/model/CategoryModel.kt | 2 ++ .../e/apps/home/model/ApplicationsLoader.kt | 1 + .../e/apps/search/model/SearchModel.kt | 3 ++ 7 files changed, 43 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index bd22178f2..31b9d9e74 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -43,7 +43,6 @@ import com.google.android.material.bottomnavigation.BottomNavigationMenuView import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.LabelVisibilityMode import com.google.android.material.snackbar.Snackbar -import foundation.e.apps.application.model.data.FullData import foundation.e.apps.applicationmanager.ApplicationManager import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnection import foundation.e.apps.applicationmanager.ApplicationManagerServiceConnectionCallback @@ -274,16 +273,15 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") - fun sentryUserAlertDialog(fullData: FullData?, error: String?, context: Context) { + fun sentryUserAlertDialog(packageName: String?, error: String?, context: Context) { val adb = AlertDialog.Builder(context) - var YouEditTextValue="" val layout = LinearLayout(context) layout.orientation = LinearLayout.VERTICAL val edittext = EditText(context) edittext.hint=getString(R.string.edittext_hint) - edittext.setFilters(arrayOf(InputFilter.LengthFilter(600))) + edittext.filters = arrayOf(InputFilter.LengthFilter(600)) val adbInflater = LayoutInflater.from(context) val eulaLayout = adbInflater.inflate(R.layout.checkbox, null) @@ -296,12 +294,9 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS dontShowAgain = eulaLayout.findViewById(R.id.skip) as CheckBox layout.addView(edittext) layout.addView(eulaLayout) - if(error!=null){ - val title =getString(R.string.edittext_title) - adb.setTitle("$title $error") - }else{ - adb.setTitle(getString(R.string.edittext_title)) - } + val title =getString(R.string.edittext_title) + adb.setTitle("$title $error") + adb.setMessage(Html.fromHtml(getString(R.string.edittext_messege))) adb.setView(layout) @@ -320,8 +315,7 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS editor.putString("userConfirmation",userConfirmation) editor.commit() // Do what you want to do on "OK" action - YouEditTextValue = edittext.text.toString() - Sentry.captureMessage(YouEditTextValue) + Sentry.captureMessage(edittext.text.toString()) return@OnClickListener }) @@ -347,14 +341,10 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS adb.show() } else if(skipMessage == "checked" && userConfirmation =="yes"){ - if(error !=null){ - val name = fullData!!.basicData.packageName - Sentry.captureMessage("$error $name"); - } - else{ + 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/ApplicationActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt index 0891fb5cf..aa0d85fb8 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -145,6 +145,7 @@ class ApplicationActivity : Snackbar.make(container, getString(error!!.description), Snackbar.LENGTH_LONG).show() + mActivity.sentryUserAlertDialog(null,"There is a parsing error", mActivity) // Close activity once snackbar has hidden object : CountDownTimer(3500, 3500) { @@ -589,7 +590,9 @@ class ApplicationActivity : Snackbar.make(container, getString(Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(fullData, (R.string.apk_unavailable).toString() ,this) + mActivity.sentryUserAlertDialog(fullData.basicData.packageName, + resources.getString(R.string.apk_unavailable) , + this) return } application.buttonClicked(this, this) @@ -622,9 +625,13 @@ class ApplicationActivity : Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!, getString(R.string.app_incompatible_message), this) + mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + getString(R.string.app_incompatible_message), + this) }else{ - mActivity.sentryUserAlertDialog(fullData!!, getString(R.string.download_failed), this) + mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + getString(R.string.download_failed), + 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 00abcf17d..41be73597 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -77,7 +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() - mActivity.sentryUserAlertDialog(application!!.fullData!!,(R.string.apk_unavailable).toString() , view.context) + mActivity.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, + view.context.resources.getString(R.string.apk_unavailable), + view.context) } else if(application?.pwabasicdata!=null){ application?.pwaInstall(activity) @@ -194,9 +196,13 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!, (R.string.app_incompatible_message).toString(),view.context ) + mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + view.context.resources.getString(R.string.app_incompatible_message), + view.context ) }else{ - mActivity.sentryUserAlertDialog(fullData!!, (R.string.download_failed).toString(), view.context) + mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + view.context.resources.getString(R.string.download_failed), + view.context) } } 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 06671dd3a..c958257f6 100644 --- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt @@ -75,7 +75,9 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(application!!.fullData!!, (R.string.apk_unavailable).toString() , view.context) + mActivity.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, + view.context.resources.getString(R.string.apk_unavailable) , + view.context) } else if(application?.pwabasicdata!=null){ application?.pwaInstall(activity) @@ -178,9 +180,13 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!, (R.string.app_incompatible_message).toString(),view.context ) + mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + view.context.resources.getString(R.string.app_incompatible_message), + view.context ) }else{ - mActivity.sentryUserAlertDialog(fullData!!, (R.string.download_failed).toString(), view.context) + mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + view.context.resources.getString(R.string.download_failed), + view.context) } } 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 b8ce442a8..d06c0fa58 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 @@ -20,6 +20,7 @@ package foundation.e.apps.categories.category.model import android.content.Context import androidx.lifecycle.MutableLiveData import foundation.e.apps.MainActivity +import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.api.ListApplicationsRequest import foundation.e.apps.api.ListPwasRequest import foundation.e.apps.application.model.Application @@ -59,6 +60,7 @@ class CategoryModel : CategoryModelInterface { categoryApplicationsList.value = result } } else { + mActivity.sentryUserAlertDialog(null,"There is a parsing error",context) screenError.value = error } }) diff --git a/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt b/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt index a7b761d76..c5d16bce0 100644 --- a/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt +++ b/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt @@ -73,6 +73,7 @@ class ApplicationsLoader(private val homeModel: HomeModel) : AsyncTask Date: Mon, 10 Aug 2020 13:26:55 +0530 Subject: [PATCH 4/6] Merge conflict fix derp --- app/src/main/java/foundation/e/apps/MainActivity.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index b0b5f4d9b..04b37f71a 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -20,9 +20,7 @@ package foundation.e.apps //import androidx.fragment.app.ListFragment import android.annotation.SuppressLint -import android.content.Context -import android.content.DialogInterface -import android.content.SharedPreferences +import android.content.* import android.content.pm.PackageManager import android.os.Bundle import android.os.Handler -- GitLab From b61393426f1a10bddd76d62a6ef032ea57a2112e Mon Sep 17 00:00:00 2001 From: Dayona Joseph Date: Mon, 17 Aug 2020 12:22:26 +0530 Subject: [PATCH 5/6] Sentry - Create separate class for User Alert dialog catch UnknownHostException --- app/src/main/AndroidManifest.xml | 2 + .../java/foundation/e/apps/MainActivity.kt | 79 ----------- .../e/apps/application/ApplicationActivity.kt | 9 +- .../apps/application/ApplicationViewHolder.kt | 7 +- .../application/SmallApplicationViewHolder.kt | 7 +- .../e/apps/application/model/AlertDialog.kt | 124 ++++++++++++++++++ .../category/model/CategoryModel.kt | 3 +- .../foundation/e/apps/home/HomeFragment.kt | 3 + .../e/apps/home/model/ApplicationsLoader.kt | 1 - .../e/apps/search/SearchFragment.kt | 3 + .../e/apps/search/model/SearchModel.kt | 2 +- .../java/foundation/e/apps/utils/Error.kt | 1 + 12 files changed, 149 insertions(+), 92 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/application/model/AlertDialog.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c66e53c1f..a6c32551b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -60,6 +60,8 @@ + + diff --git a/app/src/main/java/foundation/e/apps/MainActivity.kt b/app/src/main/java/foundation/e/apps/MainActivity.kt index 04b37f71a..dcaa0a62a 100644 --- a/app/src/main/java/foundation/e/apps/MainActivity.kt +++ b/app/src/main/java/foundation/e/apps/MainActivity.kt @@ -74,9 +74,6 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS ApplicationManagerServiceConnection(this) private val codeRequestPermissions = 9527 var doubleBackToExitPressedOnce = false; - val PREFS_NAME = "MyPrefsFile1" - var dontShowAgain: CheckBox? = null - companion object { @@ -286,80 +283,4 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS } }, 2000) } - - @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=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 = 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 =getString(R.string.edittext_title) - adb.setTitle("$title $error") - - adb.setMessage(Html.fromHtml(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 = 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 = 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/ApplicationActivity.kt b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt index bab34d263..746ef3021 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -46,6 +46,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 import foundation.e.apps.application.model.ApplicationStateListener import foundation.e.apps.application.model.Downloader import foundation.e.apps.application.model.State @@ -145,7 +146,7 @@ class ApplicationActivity : Snackbar.make(container, getString(error!!.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(null,"There is a parsing error", mActivity) + AlertDialogs().sentryUserAlertDialog(null,"There is a parsing error", this) // Close activity once snackbar has hidden object : CountDownTimer(3500, 3500) { @@ -590,7 +591,7 @@ class ApplicationActivity : Snackbar.make(container, getString(Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(fullData.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(fullData.basicData.packageName, resources.getString(R.string.apk_unavailable) , this) return @@ -625,11 +626,11 @@ class ApplicationActivity : Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, getString(R.string.app_incompatible_message), this) }else{ - mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, getString(R.string.download_failed), 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 41be73597..867209325 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -26,6 +26,7 @@ import android.view.View import android.widget.* import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar +import foundation.e.apps.AlertDialogs import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.R import foundation.e.apps.application.model.Application @@ -77,7 +78,7 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, view.context.resources.getString(R.string.apk_unavailable), view.context) } else if(application?.pwabasicdata!=null){ @@ -196,11 +197,11 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.app_incompatible_message), view.context ) }else{ - mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.download_failed), view.context) } 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 c958257f6..81cfe3566 100644 --- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt @@ -30,6 +30,7 @@ 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 import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.R import foundation.e.apps.application.model.Application @@ -75,7 +76,7 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - mActivity.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, view.context.resources.getString(R.string.apk_unavailable) , view.context) } @@ -180,11 +181,11 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.app_incompatible_message), view.context ) }else{ - mActivity.sentryUserAlertDialog(fullData!!.basicData.packageName, + AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.download_failed), view.context) } 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 000000000..5755c3543 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/application/model/AlertDialog.kt @@ -0,0 +1,124 @@ +/* + 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 : AppCompatActivity() { + + val PREFS_NAME = "MyPrefsFile1" + var dontShowAgain: CheckBox? = null + + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + } + + + @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/categories/category/model/CategoryModel.kt b/app/src/main/java/foundation/e/apps/categories/category/model/CategoryModel.kt index d06c0fa58..86f32e18d 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 import foundation.e.apps.MainActivity import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.api.ListApplicationsRequest @@ -60,7 +61,7 @@ class CategoryModel : CategoryModelInterface { categoryApplicationsList.value = result } } else { - mActivity.sentryUserAlertDialog(null,"There is a parsing error",context) + AlertDialogs().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 723df4b79..7e36db961 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 import foundation.e.apps.R import foundation.e.apps.application.model.Application import foundation.e.apps.applicationmanager.ApplicationManager @@ -111,6 +112,8 @@ class HomeFragment : Fragment() { errorDescription.text = activity!!.getString(it.description) errorContainer.visibility = View.VISIBLE progressBar.visibility = View.GONE + AlertDialogs().sentryUserAlertDialog(null,"There is a parsing error", context) + } else { errorContainer.visibility = View.GONE } diff --git a/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt b/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt index 813da7ec2..3c20fb456 100644 --- a/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt +++ b/app/src/main/java/foundation/e/apps/home/model/ApplicationsLoader.kt @@ -75,7 +75,6 @@ class ApplicationsLoader(private val homeModel: HomeModel) : AsyncTask (e as CustomException).error SocketTimeoutException::class -> return REQUEST_TIMEOUT IOException::class -> return SERVER_UNAVAILABLE + java.net.UnknownHostException::class -> return NO_INTERNET else -> UNKNOWN } } -- GitLab From 279e08b3ea8ac67bb78ee5a7d6c82b97e02fe00c Mon Sep 17 00:00:00 2001 From: Dayona Joseph Date: Tue, 18 Aug 2020 18:14:38 +0530 Subject: [PATCH 6/6] Change AlertDialog activity class to a regular singleton class --- .../e/apps/application/ApplicationActivity.kt | 11 +++++------ .../e/apps/application/ApplicationViewHolder.kt | 9 ++++----- .../apps/application/SmallApplicationViewHolder.kt | 9 ++++----- .../e/apps/application/model/AlertDialog.kt | 13 ++++++------- .../apps/categories/category/model/CategoryModel.kt | 5 ++--- .../java/foundation/e/apps/home/HomeFragment.kt | 5 ++--- .../java/foundation/e/apps/search/SearchFragment.kt | 4 ++-- 7 files changed, 25 insertions(+), 31 deletions(-) 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 746ef3021..352abba05 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationActivity.kt @@ -41,12 +41,11 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import com.google.android.material.snackbar.Snackbar -import foundation.e.apps.MainActivity.Companion.mActivity 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 +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,7 +145,7 @@ class ApplicationActivity : Snackbar.make(container, getString(error!!.description), Snackbar.LENGTH_LONG).show() - AlertDialogs().sentryUserAlertDialog(null,"There is a parsing error", this) + alertInstance.sentryUserAlertDialog(null,"There is a parsing error", this) // Close activity once snackbar has hidden object : CountDownTimer(3500, 3500) { @@ -591,7 +590,7 @@ class ApplicationActivity : Snackbar.make(container, getString(Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - AlertDialogs().sentryUserAlertDialog(fullData.basicData.packageName, + alertInstance.sentryUserAlertDialog(fullData.basicData.packageName, resources.getString(R.string.apk_unavailable) , this) return @@ -626,11 +625,11 @@ class ApplicationActivity : Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName, getString(R.string.app_incompatible_message), this) }else{ - AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName, getString(R.string.download_failed), 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 867209325..d9aeec4fb 100644 --- a/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/ApplicationViewHolder.kt @@ -26,8 +26,7 @@ import android.view.View import android.widget.* import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar -import foundation.e.apps.AlertDialogs -import foundation.e.apps.MainActivity.Companion.mActivity +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 @@ -78,7 +77,7 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - AlertDialogs().sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, view.context.resources.getString(R.string.apk_unavailable), view.context) } else if(application?.pwabasicdata!=null){ @@ -197,11 +196,11 @@ class ApplicationViewHolder(private val activity: Activity, private val view: Vi Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.app_incompatible_message), view.context ) }else{ - AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.download_failed), view.context) } 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 81cfe3566..0b2f46c02 100644 --- a/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt +++ b/app/src/main/java/foundation/e/apps/application/SmallApplicationViewHolder.kt @@ -30,8 +30,7 @@ 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 -import foundation.e.apps.MainActivity.Companion.mActivity +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 @@ -76,7 +75,7 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.make(view, activity.getString( Error.APK_UNAVAILABLE.description), Snackbar.LENGTH_LONG).show() - AlertDialogs().sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(application!!.fullData!!.basicData.packageName, view.context.resources.getString(R.string.apk_unavailable) , view.context) } @@ -181,11 +180,11 @@ class SmallApplicationViewHolder(private val activity: Activity, private val vie Snackbar.LENGTH_LONG).show() val err_description =error.description if(err_description.toString().contains("incompatible")) { - AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.app_incompatible_message), view.context ) }else{ - AlertDialogs().sentryUserAlertDialog(fullData!!.basicData.packageName, + alertInstance.sentryUserAlertDialog(fullData!!.basicData.packageName, view.context.resources.getString(R.string.download_failed), view.context) } 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 index 5755c3543..7d0ef95b9 100644 --- a/app/src/main/java/foundation/e/apps/application/model/AlertDialog.kt +++ b/app/src/main/java/foundation/e/apps/application/model/AlertDialog.kt @@ -32,19 +32,18 @@ import androidx.appcompat.app.AppCompatActivity import io.sentry.core.Sentry -class AlertDialogs : AppCompatActivity() { +class AlertDialogs { val PREFS_NAME = "MyPrefsFile1" var dontShowAgain: CheckBox? = null - - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - + 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?) { 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 86f32e18d..87c9119ae 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,9 +19,8 @@ package foundation.e.apps.categories.category.model import android.content.Context import androidx.lifecycle.MutableLiveData -import foundation.e.apps.AlertDialogs +import foundation.e.apps.AlertDialogs.Companion.alertInstance import foundation.e.apps.MainActivity -import foundation.e.apps.MainActivity.Companion.mActivity import foundation.e.apps.api.ListApplicationsRequest import foundation.e.apps.api.ListPwasRequest import foundation.e.apps.application.model.Application @@ -61,7 +60,7 @@ class CategoryModel : CategoryModelInterface { categoryApplicationsList.value = result } } else { - AlertDialogs().sentryUserAlertDialog(null,"There is a parsing error",context) + 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 7e36db961..e43b6c74e 100644 --- a/app/src/main/java/foundation/e/apps/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/home/HomeFragment.kt @@ -32,7 +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 +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 @@ -112,8 +112,7 @@ class HomeFragment : Fragment() { errorDescription.text = activity!!.getString(it.description) errorContainer.visibility = View.VISIBLE progressBar.visibility = View.GONE - AlertDialogs().sentryUserAlertDialog(null,"There is a parsing error", context) - + 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 6f33af314..d355529b9 100644 --- a/app/src/main/java/foundation/e/apps/search/SearchFragment.kt +++ b/app/src/main/java/foundation/e/apps/search/SearchFragment.kt @@ -34,7 +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 +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 @@ -157,7 +157,7 @@ class SearchFragment : Fragment(), SearchView.OnQueryTextListener, SearchView.On errorContainer.visibility = View.VISIBLE progressBar.visibility = View.GONE loadMoreContainer.visibility = View.GONE - AlertDialogs().sentryUserAlertDialog(null,"There is a parsing error", context) + alertInstance.sentryUserAlertDialog(null,"There is a parsing error", context) } else { loadMoreContainer.visibility = View.GONE -- GitLab