Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37d905d0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Move Trace Controlling to within Traceur app." into main

parents 43316838 91415237
Loading
Loading
Loading
Loading
+3 −5
Original line number Original line Diff line number Diff line
@@ -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>
+0 −1
Original line number Original line Diff line number Diff line
@@ -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>
+13 −3
Original line number Original line Diff line number Diff line
@@ -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
@@ -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,
) :
) :
@@ -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)


    /**
    /**
@@ -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
            )
            )
@@ -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()
                }
                }
+3 −1
Original line number Original line Diff line number Diff line
@@ -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)
+18 −90
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
@@ -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,
) :
) :
@@ -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
@@ -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 -> {
@@ -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)
                    }
                    }
                }
                }


@@ -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.
@@ -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