From bed42a4a612d662b5f81a674e9e83f6cfd4d750d Mon Sep 17 00:00:00 2001 From: John Trujillo Date: Tue, 4 Nov 2025 12:36:13 -0500 Subject: [PATCH 1/2] fix: Feedback report sources - Separate device info from the main feedback message body. - When generating a feedback report, search multiple output tabs (Build, App Logs, IDE Logs) for a stack trace to include, instead of only checking the currently active tab. - Add a "Stack trace unavailable" message to the feedback body if no logs are found. --- .../activities/editor/BaseEditorActivity.kt | 40 ++++++++++++------- .../androidide/utils/FeedbackManager.kt | 25 +++++++++--- resources/src/main/res/values/strings.xml | 3 +- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt index b7a366aac7..d4e91350fe 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt @@ -77,6 +77,7 @@ import com.github.mikephil.charting.formatter.IAxisValueFormatter import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout.Tab +import com.itsaky.androidide.FeedbackButtonManager import com.itsaky.androidide.R import com.itsaky.androidide.R.string import com.itsaky.androidide.actions.build.DebugAction @@ -89,6 +90,7 @@ import com.itsaky.androidide.databinding.ActivityEditorBinding import com.itsaky.androidide.databinding.ContentEditorBinding import com.itsaky.androidide.databinding.LayoutDiagnosticInfoBinding import com.itsaky.androidide.events.InstallationResultEvent +import com.itsaky.androidide.fragments.output.ShareableOutputFragment import com.itsaky.androidide.fragments.sidebar.EditorSidebarFragment import com.itsaky.androidide.fragments.sidebar.FileTreeFragment import com.itsaky.androidide.handlers.EditorActivityLifecyclerObserver @@ -128,6 +130,7 @@ import com.itsaky.androidide.viewmodel.DebuggerViewModel import com.itsaky.androidide.viewmodel.EditorViewModel import com.itsaky.androidide.viewmodel.FileManagerViewModel import com.itsaky.androidide.viewmodel.FileOpResult +import com.itsaky.androidide.viewmodel.WADBViewModel import com.itsaky.androidide.xml.resources.ResourceTableRegistry import com.itsaky.androidide.xml.versions.ApiVersionsRegistry import com.itsaky.androidide.xml.widgets.WidgetTableRegistry @@ -136,9 +139,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import com.itsaky.androidide.FeedbackButtonManager -import com.itsaky.androidide.fragments.output.ShareableOutputFragment -import com.itsaky.androidide.viewmodel.WADBViewModel import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode.MAIN import org.slf4j.Logger @@ -595,7 +595,11 @@ abstract class BaseEditorActivity : } feedbackButtonManager = - FeedbackButtonManager(activity = this, feedbackFab = binding.fabFeedback) + FeedbackButtonManager( + activity = this, + feedbackFab = binding.fabFeedback, + getLogContent = ::getLogContent, + ) feedbackButtonManager?.setupDraggableFab() setupMemUsageChart() @@ -1476,17 +1480,25 @@ abstract class BaseEditorActivity : } private fun getLogContent(): String? { - if (bottomSheetViewModel.sheetBehaviorState == BottomSheetBehavior.STATE_COLLAPSED) { - return null + val pagerAdapter = binding.content.bottomSheet.pagerAdapter + + val candidateTabs = buildList { + add(bottomSheetViewModel.currentTab) + add(BottomSheetViewModel.TAB_BUILD_OUTPUT) + add(BottomSheetViewModel.TAB_APPLICATION_LOGS) + add(BottomSheetViewModel.TAB_IDE_LOGS) + }.distinct() + + candidateTabs.forEach { tabIndex -> + val fragment = pagerAdapter.getFragmentAtIndex(tabIndex) + if (fragment is ShareableOutputFragment) { + val shareable = fragment.getShareableContent().trim() + if (shareable.isNotEmpty()) { + return shareable + } + } } - val fragment = this.binding.content.bottomSheet.pagerAdapter.getFragmentAtIndex( - bottomSheetViewModel.currentTab - ) - - return when (fragment) { - is ShareableOutputFragment -> fragment.getShareableContent() - else -> null - } + return null } } diff --git a/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt b/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt index e5e1313f04..151348ff1a 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt +++ b/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt @@ -290,13 +290,26 @@ object FeedbackManager { val feedbackRecipient = activity.getString(R.string.feedback_email) val feedbackSubject = activity.getString(R.string.feedback_subject, getCurrentScreenName(activity)) + val stackTraceSection = + logContent?.trim().takeIf { it?.isNotEmpty() == true } + ?: activity.getString(R.string.feedback_stack_trace_unavailable) val feedbackBody = - activity.getString( - R.string.feedback_message, - BuildInfo.VERSION_NAME_SIMPLE, - Build.VERSION.RELEASE, - "${Build.MANUFACTURER} ${Build.MODEL}", - ) + buildString { + append( + activity.getString( + R.string.feedback_message, + stackTraceSection, + ), + ) + append( + activity.getString( + R.string.feedback_device_info, + BuildInfo.VERSION_NAME_SIMPLE, + Build.VERSION.RELEASE, + "${Build.MANUFACTURER} ${Build.MODEL}", + ), + ) + } val emailIntent = handler.prepareEmailIntent( diff --git a/resources/src/main/res/values/strings.xml b/resources/src/main/res/values/strings.xml index ab9e4df706..15a5f5aed6 100644 --- a/resources/src/main/res/values/strings.xml +++ b/resources/src/main/res/values/strings.xml @@ -685,8 +685,9 @@ To send a private message to feedback@appdevforall.org, tap OK. If you aren’t connected to the Internet, the message will not be sent immediately. Do you want to continue? Feedback for %1$s Screen - Please enter your feedback in the space below. If you are reporting a problem, please include as much information as possible about the issue.\n\nThanks!\n\nVersion: %1$s\n\n-------------stack trace----------\n%2$s + Please enter your feedback in the space below. If you are reporting a problem, please include as much information as possible about the issue.\n\nThanks!\n\n-------------stack trace----------\n%1$s \n\nApp Version: %1$s\n\nAndroid Version: %2$s\n\nDevice: %3$s + Stack trace unavailable. Please describe the issue you encountered. Send feedback Send feedback More From b7c114790ddcdf8671e74f86a0e1979733bf2b73 Mon Sep 17 00:00:00 2001 From: John Trujillo Date: Wed, 19 Nov 2025 12:00:16 -0500 Subject: [PATCH 2/2] refactor(FeedbackManager): Change information order, first App, system and device info, then user message and stack trace. --- .../com/itsaky/androidide/utils/FeedbackManager.kt | 12 ++++++------ resources/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt b/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt index 151348ff1a..0cfa87735a 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt +++ b/common/src/main/java/com/itsaky/androidide/utils/FeedbackManager.kt @@ -295,12 +295,6 @@ object FeedbackManager { ?: activity.getString(R.string.feedback_stack_trace_unavailable) val feedbackBody = buildString { - append( - activity.getString( - R.string.feedback_message, - stackTraceSection, - ), - ) append( activity.getString( R.string.feedback_device_info, @@ -309,6 +303,12 @@ object FeedbackManager { "${Build.MANUFACTURER} ${Build.MODEL}", ), ) + append( + activity.getString( + R.string.feedback_message, + stackTraceSection, + ), + ) } val emailIntent = diff --git a/resources/src/main/res/values/strings.xml b/resources/src/main/res/values/strings.xml index 169b2559d1..e650f5c98a 100644 --- a/resources/src/main/res/values/strings.xml +++ b/resources/src/main/res/values/strings.xml @@ -806,8 +806,8 @@ To send a private message to feedback@appdevforall.org, tap OK. If you aren’t connected to the Internet, the message will not be sent immediately. Do you want to continue? Feedback for %1$s Screen - Please enter your feedback in the space below. If you are reporting a problem, please include as much information as possible about the issue.\n\nThanks!\n\n-------------stack trace----------\n%1$s - \n\nApp Version: %1$s\n\nAndroid Version: %2$s\n\nDevice: %3$s + \n\nPlease enter your feedback in the space below. If you are reporting a problem, please include as much information as possible about the issue.\n\nThanks!\n\n-------------stack trace----------\n%1$s + App Version: %1$s\n\nAndroid Version: %2$s\n\nDevice: %3$s Stack trace unavailable. Please describe the issue you encountered. Send feedback Send feedback