Loading packages/SystemUI/res/values/strings.xml +3 −5 Original line number Original line Diff line number Diff line Loading @@ -895,11 +895,9 @@ <string name="qs_record_issue_dropdown_screenrecord">Screen record</string> <string name="qs_record_issue_dropdown_screenrecord">Screen record</string> <!-- QuickSettings: Issue Type Drop down choices list in Record Issue Start Dialog [CHAR LIMIT=30] --> <!-- QuickSettings: Issue Type Drop down choices list in Record Issue Start Dialog [CHAR LIMIT=30] --> <string-array name="qs_record_issue_types"> <string name="performance">Performance</string> <item>Performance</item> <string name="user_interface">User Interface</string> <item>User Interface</item> <string name="thermal">Thermal</string> <item>Battery</item> </string-array> <!-- QuickSettings: Label for the toggle that controls whether One-handed mode is enabled. [CHAR LIMIT=NONE] --> <!-- QuickSettings: Label for the toggle that controls whether One-handed mode is enabled. [CHAR LIMIT=NONE] --> <string name="quick_settings_onehanded_label">One-handed mode</string> <string name="quick_settings_onehanded_label">One-handed mode</string> Loading packages/SystemUI/res/xml/fileprovider.xml +0 −1 Original line number Original line Diff line number Diff line Loading @@ -19,5 +19,4 @@ <cache-path name="leak" path="leak/"/> <cache-path name="leak" path="leak/"/> <external-path name="screenrecord" path="."/> <external-path name="screenrecord" path="."/> <cache-path name="multi_user" path="multi_user/" /> <cache-path name="multi_user" path="multi_user/" /> <root-path name="traces" path="/data/local/traces"/> </paths> </paths> packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt +13 −3 Original line number Original line Diff line number Diff line Loading @@ -46,11 +46,14 @@ import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.recordissue.IssueRecordingService import com.android.systemui.recordissue.IssueRecordingService import com.android.systemui.recordissue.IssueRecordingState import com.android.systemui.recordissue.IssueRecordingState import com.android.systemui.recordissue.RecordIssueDialogDelegate import com.android.systemui.recordissue.RecordIssueDialogDelegate import com.android.systemui.recordissue.TraceurMessageSender import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.screenrecord.RecordingService import com.android.systemui.screenrecord.RecordingService import com.android.systemui.settings.UserContextProvider import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.traceur.TraceUtils.PresetTraceType import java.util.concurrent.Executor import javax.inject.Inject import javax.inject.Inject class RecordIssueTile class RecordIssueTile Loading @@ -70,6 +73,8 @@ constructor( private val dialogTransitionAnimator: DialogTransitionAnimator, private val dialogTransitionAnimator: DialogTransitionAnimator, private val panelInteractor: PanelInteractor, private val panelInteractor: PanelInteractor, private val userContextProvider: UserContextProvider, private val userContextProvider: UserContextProvider, private val traceurMessageSender: TraceurMessageSender, @Background private val bgExecutor: Executor, private val issueRecordingState: IssueRecordingState, private val issueRecordingState: IssueRecordingState, private val delegateFactory: RecordIssueDialogDelegate.Factory, private val delegateFactory: RecordIssueDialogDelegate.Factory, ) : ) : Loading @@ -96,6 +101,11 @@ constructor( } } } } override fun handleDestroy() { super.handleDestroy() bgExecutor.execute { traceurMessageSender.unbindFromTraceur(mContext) } } override fun getTileLabel(): CharSequence = mContext.getString(R.string.qs_record_issue_label) override fun getTileLabel(): CharSequence = mContext.getString(R.string.qs_record_issue_label) /** /** Loading @@ -121,14 +131,14 @@ constructor( } } } } private fun startIssueRecordingService(screenRecord: Boolean, winscopeTracing: Boolean) = private fun startIssueRecordingService(screenRecord: Boolean, traceType: PresetTraceType) = PendingIntent.getForegroundService( PendingIntent.getForegroundService( userContextProvider.userContext, userContextProvider.userContext, RecordingService.REQUEST_CODE, RecordingService.REQUEST_CODE, IssueRecordingService.getStartIntent( IssueRecordingService.getStartIntent( userContextProvider.userContext, userContextProvider.userContext, screenRecord, screenRecord, winscopeTracing traceType ), ), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) ) Loading @@ -147,7 +157,7 @@ constructor( val dialog: AlertDialog = val dialog: AlertDialog = delegateFactory delegateFactory .create { .create { startIssueRecordingService(it.screenRecord, it.winscopeTracing) startIssueRecordingService(it.screenRecord, it.traceType) dialogTransitionAnimator.disableAllCurrentDialogsExitAnimations() dialogTransitionAnimator.disableAllCurrentDialogsExitAnimations() panelInteractor.collapsePanels() panelInteractor.collapsePanels() } } Loading packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingConfig.kt +3 −1 Original line number Original line Diff line number Diff line Loading @@ -16,4 +16,6 @@ package com.android.systemui.recordissue package com.android.systemui.recordissue data class IssueRecordingConfig(val screenRecord: Boolean, val winscopeTracing: Boolean) import com.android.traceur.TraceUtils.PresetTraceType data class IssueRecordingConfig(val screenRecord: Boolean, val traceType: PresetTraceType) packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt +18 −90 Original line number Original line Diff line number Diff line Loading @@ -24,8 +24,6 @@ import android.content.res.Resources import android.net.Uri import android.net.Uri import android.os.Handler import android.os.Handler import android.os.UserHandle import android.os.UserHandle import android.util.Log import androidx.core.content.FileProvider import com.android.internal.logging.UiEventLogger import com.android.internal.logging.UiEventLogger import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.dagger.qualifiers.LongRunning import com.android.systemui.dagger.qualifiers.LongRunning Loading @@ -37,16 +35,10 @@ import com.android.systemui.screenrecord.RecordingService import com.android.systemui.screenrecord.RecordingServiceStrings import com.android.systemui.screenrecord.RecordingServiceStrings import com.android.systemui.settings.UserContextProvider import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.traceur.FileSender import com.android.traceur.MessageConstants.INTENT_EXTRA_TRACE_TYPE import com.android.traceur.TraceUtils import com.android.traceur.TraceUtils.PresetTraceType import java.io.File import java.io.FileOutputStream import java.nio.file.Files import java.util.concurrent.Executor import java.util.concurrent.Executor import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream import javax.inject.Inject import javax.inject.Inject import kotlin.jvm.optionals.getOrElse class IssueRecordingService class IssueRecordingService @Inject @Inject Loading @@ -60,6 +52,7 @@ constructor( keyguardDismissUtil: KeyguardDismissUtil, keyguardDismissUtil: KeyguardDismissUtil, private val dialogTransitionAnimator: DialogTransitionAnimator, private val dialogTransitionAnimator: DialogTransitionAnimator, private val panelInteractor: PanelInteractor, private val panelInteractor: PanelInteractor, private val traceurMessageSender: TraceurMessageSender, private val issueRecordingState: IssueRecordingState, private val issueRecordingState: IssueRecordingState, private val iActivityManager: IActivityManager, private val iActivityManager: IActivityManager, ) : ) : Loading @@ -82,17 +75,14 @@ constructor( override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { when (intent?.action) { ACTION_START -> { ACTION_START -> { TraceUtils.traceStart( bgExecutor.execute { this, traceurMessageSender.startTracing( DEFAULT_TRACE_TAGS, intent.getSerializableExtra( DEFAULT_BUFFER_SIZE, INTENT_EXTRA_TRACE_TYPE, DEFAULT_IS_INCLUDING_WINSCOPE, PresetTraceType::class.java DEFAULT_IS_INCLUDING_APP_TRACE, ) DEFAULT_IS_LONG_TRACE, DEFAULT_ATTACH_TO_BUGREPORT, DEFAULT_MAX_TRACE_SIZE, DEFAULT_MAX_TRACE_DURATION_IN_MINUTES ) ) } issueRecordingState.isRecording = true issueRecordingState.isRecording = true if (!intent.getBooleanExtra(EXTRA_SCREEN_RECORD, false)) { if (!intent.getBooleanExtra(EXTRA_SCREEN_RECORD, false)) { // If we don't want to record the screen, the ACTION_SHOW_START_NOTIF action // If we don't want to record the screen, the ACTION_SHOW_START_NOTIF action Loading @@ -102,7 +92,10 @@ constructor( } } ACTION_STOP, ACTION_STOP, ACTION_STOP_NOTIF -> { ACTION_STOP_NOTIF -> { TraceUtils.traceStop(this) // ViewCapture needs to save it's data before it is disabled, or else the data will // be lost. This is expected to change in the near future, and when that happens // this line should be removed. bgExecutor.execute { traceurMessageSender.stopTracing() } issueRecordingState.isRecording = false issueRecordingState.isRecording = false } } ACTION_SHARE -> { ACTION_SHARE -> { Loading @@ -117,7 +110,7 @@ constructor( if (issueRecordingState.takeBugReport) { if (issueRecordingState.takeBugReport) { iActivityManager.requestBugReportWithExtraAttachment(screenRecording) iActivityManager.requestBugReportWithExtraAttachment(screenRecording) } else { } else { shareRecording(screenRecording) traceurMessageSender.shareTraces(applicationContext, screenRecording) } } } } Loading @@ -134,75 +127,10 @@ constructor( return super.onStartCommand(intent, flags, startId) return super.onStartCommand(intent, flags, startId) } } private fun shareRecording(screenRecording: Uri?) { val traces = TraceUtils.traceDump(this, TRACE_FILE_NAME).getOrElse { Log.v( TAG, "Traces were not present. This can happen if users double" + "click on share notification. Traces are cleaned up after sharing" + "so they won't be present for the 2nd share attempt." ) return } val perfetto = FileProvider.getUriForFile(this, AUTHORITY, traces.first()) val urisToShare = mutableListOf(perfetto) traces.removeFirst() getZipWinscopeFileUri(traces)?.let { urisToShare.add(it) } screenRecording?.let { urisToShare.add(it) } val sendIntent = FileSender.buildSendIntent(this, urisToShare).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // TODO: Debug why the notification shade isn't closing upon starting the BetterBug activity mKeyguardDismissUtil.executeWhenUnlocked( { startActivity(sendIntent) false }, false, false ) } private fun getZipWinscopeFileUri(traceFiles: List<File>): Uri? { try { externalCacheDir?.mkdirs() val outZip: File = File.createTempFile(TEMP_FILE_PREFIX, ZIP_SUFFIX, externalCacheDir) ZipOutputStream(FileOutputStream(outZip)).use { os -> traceFiles.forEach { file -> os.putNextEntry(ZipEntry(file.name)) Files.copy(file.toPath(), os) os.closeEntry() } } return FileProvider.getUriForFile(this, AUTHORITY, outZip) } catch (e: Exception) { Log.e(TAG, "Failed to zip and package Recordings. Cannot share with BetterBug.", e) return null } } companion object { companion object { private const val TAG = "IssueRecordingService" private const val TAG = "IssueRecordingService" private const val CHANNEL_ID = "issue_record" private const val CHANNEL_ID = "issue_record" private const val EXTRA_SCREEN_RECORD = "extra_screenRecord" private const val EXTRA_SCREEN_RECORD = "extra_screenRecord" private const val EXTRA_WINSCOPE_TRACING = "extra_winscopeTracing" private const val ZIP_SUFFIX = ".zip" private const val TEMP_FILE_PREFIX = "winscope_recordings" private val DEFAULT_TRACE_TAGS = listOf<String>() private const val DEFAULT_BUFFER_SIZE = 16384 private const val DEFAULT_IS_INCLUDING_WINSCOPE = true private const val DEFAULT_IS_LONG_TRACE = false private const val DEFAULT_IS_INCLUDING_APP_TRACE = true private const val DEFAULT_ATTACH_TO_BUGREPORT = true private const val DEFAULT_MAX_TRACE_SIZE = 10240 private const val DEFAULT_MAX_TRACE_DURATION_IN_MINUTES = 30 private val TRACE_FILE_NAME = TraceUtils.getOutputFilename(TraceUtils.RecordingType.TRACE) private const val AUTHORITY = "com.android.systemui.fileprovider" /** /** * Get an intent to stop the issue recording service. * Get an intent to stop the issue recording service. Loading @@ -223,12 +151,12 @@ constructor( fun getStartIntent( fun getStartIntent( context: Context, context: Context, screenRecord: Boolean, screenRecord: Boolean, winscopeTracing: Boolean, traceType: PresetTraceType, ): Intent = ): Intent = Intent(context, IssueRecordingService::class.java) Intent(context, IssueRecordingService::class.java) .setAction(ACTION_START) .setAction(ACTION_START) .putExtra(EXTRA_SCREEN_RECORD, screenRecord) .putExtra(EXTRA_SCREEN_RECORD, screenRecord) .putExtra(EXTRA_WINSCOPE_TRACING, winscopeTracing) .putExtra(INTENT_EXTRA_TRACE_TYPE, traceType) } } } } Loading Loading
packages/SystemUI/res/values/strings.xml +3 −5 Original line number Original line Diff line number Diff line Loading @@ -895,11 +895,9 @@ <string name="qs_record_issue_dropdown_screenrecord">Screen record</string> <string name="qs_record_issue_dropdown_screenrecord">Screen record</string> <!-- QuickSettings: Issue Type Drop down choices list in Record Issue Start Dialog [CHAR LIMIT=30] --> <!-- QuickSettings: Issue Type Drop down choices list in Record Issue Start Dialog [CHAR LIMIT=30] --> <string-array name="qs_record_issue_types"> <string name="performance">Performance</string> <item>Performance</item> <string name="user_interface">User Interface</string> <item>User Interface</item> <string name="thermal">Thermal</string> <item>Battery</item> </string-array> <!-- QuickSettings: Label for the toggle that controls whether One-handed mode is enabled. [CHAR LIMIT=NONE] --> <!-- QuickSettings: Label for the toggle that controls whether One-handed mode is enabled. [CHAR LIMIT=NONE] --> <string name="quick_settings_onehanded_label">One-handed mode</string> <string name="quick_settings_onehanded_label">One-handed mode</string> Loading
packages/SystemUI/res/xml/fileprovider.xml +0 −1 Original line number Original line Diff line number Diff line Loading @@ -19,5 +19,4 @@ <cache-path name="leak" path="leak/"/> <cache-path name="leak" path="leak/"/> <external-path name="screenrecord" path="."/> <external-path name="screenrecord" path="."/> <cache-path name="multi_user" path="multi_user/" /> <cache-path name="multi_user" path="multi_user/" /> <root-path name="traces" path="/data/local/traces"/> </paths> </paths>
packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt +13 −3 Original line number Original line Diff line number Diff line Loading @@ -46,11 +46,14 @@ import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.recordissue.IssueRecordingService import com.android.systemui.recordissue.IssueRecordingService import com.android.systemui.recordissue.IssueRecordingState import com.android.systemui.recordissue.IssueRecordingState import com.android.systemui.recordissue.RecordIssueDialogDelegate import com.android.systemui.recordissue.RecordIssueDialogDelegate import com.android.systemui.recordissue.TraceurMessageSender import com.android.systemui.res.R import com.android.systemui.res.R import com.android.systemui.screenrecord.RecordingService import com.android.systemui.screenrecord.RecordingService import com.android.systemui.settings.UserContextProvider import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.traceur.TraceUtils.PresetTraceType import java.util.concurrent.Executor import javax.inject.Inject import javax.inject.Inject class RecordIssueTile class RecordIssueTile Loading @@ -70,6 +73,8 @@ constructor( private val dialogTransitionAnimator: DialogTransitionAnimator, private val dialogTransitionAnimator: DialogTransitionAnimator, private val panelInteractor: PanelInteractor, private val panelInteractor: PanelInteractor, private val userContextProvider: UserContextProvider, private val userContextProvider: UserContextProvider, private val traceurMessageSender: TraceurMessageSender, @Background private val bgExecutor: Executor, private val issueRecordingState: IssueRecordingState, private val issueRecordingState: IssueRecordingState, private val delegateFactory: RecordIssueDialogDelegate.Factory, private val delegateFactory: RecordIssueDialogDelegate.Factory, ) : ) : Loading @@ -96,6 +101,11 @@ constructor( } } } } override fun handleDestroy() { super.handleDestroy() bgExecutor.execute { traceurMessageSender.unbindFromTraceur(mContext) } } override fun getTileLabel(): CharSequence = mContext.getString(R.string.qs_record_issue_label) override fun getTileLabel(): CharSequence = mContext.getString(R.string.qs_record_issue_label) /** /** Loading @@ -121,14 +131,14 @@ constructor( } } } } private fun startIssueRecordingService(screenRecord: Boolean, winscopeTracing: Boolean) = private fun startIssueRecordingService(screenRecord: Boolean, traceType: PresetTraceType) = PendingIntent.getForegroundService( PendingIntent.getForegroundService( userContextProvider.userContext, userContextProvider.userContext, RecordingService.REQUEST_CODE, RecordingService.REQUEST_CODE, IssueRecordingService.getStartIntent( IssueRecordingService.getStartIntent( userContextProvider.userContext, userContextProvider.userContext, screenRecord, screenRecord, winscopeTracing traceType ), ), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) ) Loading @@ -147,7 +157,7 @@ constructor( val dialog: AlertDialog = val dialog: AlertDialog = delegateFactory delegateFactory .create { .create { startIssueRecordingService(it.screenRecord, it.winscopeTracing) startIssueRecordingService(it.screenRecord, it.traceType) dialogTransitionAnimator.disableAllCurrentDialogsExitAnimations() dialogTransitionAnimator.disableAllCurrentDialogsExitAnimations() panelInteractor.collapsePanels() panelInteractor.collapsePanels() } } Loading
packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingConfig.kt +3 −1 Original line number Original line Diff line number Diff line Loading @@ -16,4 +16,6 @@ package com.android.systemui.recordissue package com.android.systemui.recordissue data class IssueRecordingConfig(val screenRecord: Boolean, val winscopeTracing: Boolean) import com.android.traceur.TraceUtils.PresetTraceType data class IssueRecordingConfig(val screenRecord: Boolean, val traceType: PresetTraceType)
packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt +18 −90 Original line number Original line Diff line number Diff line Loading @@ -24,8 +24,6 @@ import android.content.res.Resources import android.net.Uri import android.net.Uri import android.os.Handler import android.os.Handler import android.os.UserHandle import android.os.UserHandle import android.util.Log import androidx.core.content.FileProvider import com.android.internal.logging.UiEventLogger import com.android.internal.logging.UiEventLogger import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.dagger.qualifiers.LongRunning import com.android.systemui.dagger.qualifiers.LongRunning Loading @@ -37,16 +35,10 @@ import com.android.systemui.screenrecord.RecordingService import com.android.systemui.screenrecord.RecordingServiceStrings import com.android.systemui.screenrecord.RecordingServiceStrings import com.android.systemui.settings.UserContextProvider import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.traceur.FileSender import com.android.traceur.MessageConstants.INTENT_EXTRA_TRACE_TYPE import com.android.traceur.TraceUtils import com.android.traceur.TraceUtils.PresetTraceType import java.io.File import java.io.FileOutputStream import java.nio.file.Files import java.util.concurrent.Executor import java.util.concurrent.Executor import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream import javax.inject.Inject import javax.inject.Inject import kotlin.jvm.optionals.getOrElse class IssueRecordingService class IssueRecordingService @Inject @Inject Loading @@ -60,6 +52,7 @@ constructor( keyguardDismissUtil: KeyguardDismissUtil, keyguardDismissUtil: KeyguardDismissUtil, private val dialogTransitionAnimator: DialogTransitionAnimator, private val dialogTransitionAnimator: DialogTransitionAnimator, private val panelInteractor: PanelInteractor, private val panelInteractor: PanelInteractor, private val traceurMessageSender: TraceurMessageSender, private val issueRecordingState: IssueRecordingState, private val issueRecordingState: IssueRecordingState, private val iActivityManager: IActivityManager, private val iActivityManager: IActivityManager, ) : ) : Loading @@ -82,17 +75,14 @@ constructor( override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { when (intent?.action) { ACTION_START -> { ACTION_START -> { TraceUtils.traceStart( bgExecutor.execute { this, traceurMessageSender.startTracing( DEFAULT_TRACE_TAGS, intent.getSerializableExtra( DEFAULT_BUFFER_SIZE, INTENT_EXTRA_TRACE_TYPE, DEFAULT_IS_INCLUDING_WINSCOPE, PresetTraceType::class.java DEFAULT_IS_INCLUDING_APP_TRACE, ) DEFAULT_IS_LONG_TRACE, DEFAULT_ATTACH_TO_BUGREPORT, DEFAULT_MAX_TRACE_SIZE, DEFAULT_MAX_TRACE_DURATION_IN_MINUTES ) ) } issueRecordingState.isRecording = true issueRecordingState.isRecording = true if (!intent.getBooleanExtra(EXTRA_SCREEN_RECORD, false)) { if (!intent.getBooleanExtra(EXTRA_SCREEN_RECORD, false)) { // If we don't want to record the screen, the ACTION_SHOW_START_NOTIF action // If we don't want to record the screen, the ACTION_SHOW_START_NOTIF action Loading @@ -102,7 +92,10 @@ constructor( } } ACTION_STOP, ACTION_STOP, ACTION_STOP_NOTIF -> { ACTION_STOP_NOTIF -> { TraceUtils.traceStop(this) // ViewCapture needs to save it's data before it is disabled, or else the data will // be lost. This is expected to change in the near future, and when that happens // this line should be removed. bgExecutor.execute { traceurMessageSender.stopTracing() } issueRecordingState.isRecording = false issueRecordingState.isRecording = false } } ACTION_SHARE -> { ACTION_SHARE -> { Loading @@ -117,7 +110,7 @@ constructor( if (issueRecordingState.takeBugReport) { if (issueRecordingState.takeBugReport) { iActivityManager.requestBugReportWithExtraAttachment(screenRecording) iActivityManager.requestBugReportWithExtraAttachment(screenRecording) } else { } else { shareRecording(screenRecording) traceurMessageSender.shareTraces(applicationContext, screenRecording) } } } } Loading @@ -134,75 +127,10 @@ constructor( return super.onStartCommand(intent, flags, startId) return super.onStartCommand(intent, flags, startId) } } private fun shareRecording(screenRecording: Uri?) { val traces = TraceUtils.traceDump(this, TRACE_FILE_NAME).getOrElse { Log.v( TAG, "Traces were not present. This can happen if users double" + "click on share notification. Traces are cleaned up after sharing" + "so they won't be present for the 2nd share attempt." ) return } val perfetto = FileProvider.getUriForFile(this, AUTHORITY, traces.first()) val urisToShare = mutableListOf(perfetto) traces.removeFirst() getZipWinscopeFileUri(traces)?.let { urisToShare.add(it) } screenRecording?.let { urisToShare.add(it) } val sendIntent = FileSender.buildSendIntent(this, urisToShare).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // TODO: Debug why the notification shade isn't closing upon starting the BetterBug activity mKeyguardDismissUtil.executeWhenUnlocked( { startActivity(sendIntent) false }, false, false ) } private fun getZipWinscopeFileUri(traceFiles: List<File>): Uri? { try { externalCacheDir?.mkdirs() val outZip: File = File.createTempFile(TEMP_FILE_PREFIX, ZIP_SUFFIX, externalCacheDir) ZipOutputStream(FileOutputStream(outZip)).use { os -> traceFiles.forEach { file -> os.putNextEntry(ZipEntry(file.name)) Files.copy(file.toPath(), os) os.closeEntry() } } return FileProvider.getUriForFile(this, AUTHORITY, outZip) } catch (e: Exception) { Log.e(TAG, "Failed to zip and package Recordings. Cannot share with BetterBug.", e) return null } } companion object { companion object { private const val TAG = "IssueRecordingService" private const val TAG = "IssueRecordingService" private const val CHANNEL_ID = "issue_record" private const val CHANNEL_ID = "issue_record" private const val EXTRA_SCREEN_RECORD = "extra_screenRecord" private const val EXTRA_SCREEN_RECORD = "extra_screenRecord" private const val EXTRA_WINSCOPE_TRACING = "extra_winscopeTracing" private const val ZIP_SUFFIX = ".zip" private const val TEMP_FILE_PREFIX = "winscope_recordings" private val DEFAULT_TRACE_TAGS = listOf<String>() private const val DEFAULT_BUFFER_SIZE = 16384 private const val DEFAULT_IS_INCLUDING_WINSCOPE = true private const val DEFAULT_IS_LONG_TRACE = false private const val DEFAULT_IS_INCLUDING_APP_TRACE = true private const val DEFAULT_ATTACH_TO_BUGREPORT = true private const val DEFAULT_MAX_TRACE_SIZE = 10240 private const val DEFAULT_MAX_TRACE_DURATION_IN_MINUTES = 30 private val TRACE_FILE_NAME = TraceUtils.getOutputFilename(TraceUtils.RecordingType.TRACE) private const val AUTHORITY = "com.android.systemui.fileprovider" /** /** * Get an intent to stop the issue recording service. * Get an intent to stop the issue recording service. Loading @@ -223,12 +151,12 @@ constructor( fun getStartIntent( fun getStartIntent( context: Context, context: Context, screenRecord: Boolean, screenRecord: Boolean, winscopeTracing: Boolean, traceType: PresetTraceType, ): Intent = ): Intent = Intent(context, IssueRecordingService::class.java) Intent(context, IssueRecordingService::class.java) .setAction(ACTION_START) .setAction(ACTION_START) .putExtra(EXTRA_SCREEN_RECORD, screenRecord) .putExtra(EXTRA_SCREEN_RECORD, screenRecord) .putExtra(EXTRA_WINSCOPE_TRACING, winscopeTracing) .putExtra(INTENT_EXTRA_TRACE_TYPE, traceType) } } } } Loading