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

Commit 12e8576f authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 9744603 from 84e8062d to udc-release

Change-Id: Ia269f40d72871fb564767d47a2852a334d986f15
parents 152b97e3 84e8062d
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
plugins {
    id 'sysuigradleproject.android-library-conventions'
    id 'com.android.library'
}

android {
    namespace = "com.android.launcher3.icons"
    sourceSets {
        main {
            java.srcDirs = ['src', 'src_full_lib']
@@ -10,8 +11,7 @@ android {
            res.srcDirs = ['res']
        }
    }

    lintOptions {
    lint {
        abortOnError false
    }

+2 −2
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ java_library {
    name: "motion_tool_proto",
    srcs: ["src/com/android/app/motiontool/proto/*.proto"],
    proto: {
        type: "nano",
        type: "lite",
        local_include_dirs:[
            "src/com/android/app/motiontool/proto"
        ],
@@ -29,7 +29,7 @@ java_library {
        ],
    },
    static_libs: [
        "libprotobuf-java-nano",
        "libprotobuf-java-lite",
        "view_capture_proto",
    ],
    java_version: "1.8",
+19 −20
Original line number Diff line number Diff line
plugins {
    id 'sysuigradleproject.android-library-conventions'
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.protobuf'
}
@@ -7,18 +7,11 @@ plugins {
final String PROTOS_DIR = "${ANDROID_TOP}/frameworks/libs/systemui/motiontoollib/src/com/android/app/motiontool/proto"

android {
    compileSdk TARGET_SDK.toInteger()
    buildToolsVersion = BUILD_TOOLS_VERSION

    namespace = "com.android.app.motiontool"
    defaultConfig {
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    defaultConfig {
        minSdkVersion TARGET_SDK.toInteger()
        targetSdkVersion TARGET_SDK.toInteger()
    }

    sourceSets {
        main {
            java.srcDirs = ['src']
@@ -30,15 +23,15 @@ android {
            manifest.srcFile "tests/AndroidManifest.xml"
        }
    }

    lintOptions {
    lint {
        abortOnError false
    }

}

dependencies {
    implementation "androidx.core:core:1.9.0"
    implementation PROTOBUF_DEPENDENCY
    implementation "com.google.protobuf:protobuf-lite:${protobuf_lite_version}"
    api project(":ViewCaptureLib")
    androidTestImplementation project(':SharedTestLib')
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
@@ -49,14 +42,20 @@ protobuf {
    // Configure the protoc executable
    protoc {
        artifact = "com.google.protobuf:protoc:${protobuf_version}${PROTO_ARCH_SUFFIX}"
    }
    plugins {
        javalite {
            // The codegen for lite comes as a separate artifact
            artifact = "com.google.protobuf:protoc-gen-javalite:${protobuf_version}${PROTO_ARCH_SUFFIX}"
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
                    javanano {
                        option "enum_style=c"
                    }
            }
            task.plugins {
                javalite { }
            }
        }
    }
+48 −62
Original line number Diff line number Diff line
@@ -17,9 +17,7 @@
package com.android.app.motiontool

import android.ddm.DdmHandle
import com.android.app.motiontool.nano.*
import com.google.protobuf.nano.InvalidProtocolBufferNanoException
import com.google.protobuf.nano.MessageNano
import com.google.protobuf.InvalidProtocolBufferException
import org.apache.harmony.dalvik.ddmc.Chunk
import org.apache.harmony.dalvik.ddmc.ChunkHandler
import org.apache.harmony.dalvik.ddmc.DdmServer
@@ -67,19 +65,18 @@ class DdmHandleMotionTool private constructor(
        val protoRequest =
            try {
                MotionToolsRequest.parseFrom(requestDataBuffer.array())
            } catch (e: InvalidProtocolBufferNanoException) {
                val parseErrorResponse =
                    ErrorResponse().apply {
                        code = ErrorResponse.INVALID_REQUEST
                        message = "Invalid request format (Protobuf parse exception)"
                    }
                val wrappedResponse = MotionToolsResponse().apply { error = parseErrorResponse }
                val responseData = MessageNano.toByteArray(wrappedResponse)
            } catch (e: InvalidProtocolBufferException) {
                val responseData: ByteArray = MotionToolsResponse.newBuilder()
                        .setError(ErrorResponse.newBuilder()
                                .setCode(ErrorResponse.Code.INVALID_REQUEST)
                                .setMessage("Invalid request format (Protobuf parse exception)"))
                        .build()
                        .toByteArray()
                return Chunk(CHUNK_MOTO, responseData, 0, responseData.size)
            }

        val response =
            when (protoRequest.typeCase) {
            when (protoRequest.typeCase.number) {
                MotionToolsRequest.HANDSHAKE_FIELD_NUMBER ->
                    handleHandshakeRequest(protoRequest.handshake)
                MotionToolsRequest.BEGIN_TRACE_FIELD_NUMBER ->
@@ -89,61 +86,50 @@ class DdmHandleMotionTool private constructor(
                MotionToolsRequest.END_TRACE_FIELD_NUMBER ->
                    handleEndTraceRequest(protoRequest.endTrace)
                else ->
                    MotionToolsResponse().apply {
                        error =
                            ErrorResponse().apply {
                                code = ErrorResponse.INVALID_REQUEST
                                message = "Unknown request type"
                            }
                    }
                    MotionToolsResponse.newBuilder().setError(ErrorResponse.newBuilder()
                            .setCode(ErrorResponse.Code.INVALID_REQUEST)
                            .setMessage("Unknown request type")).build()
            }

        val responseData = MessageNano.toByteArray(response)
        val responseData = response.toByteArray()
        return Chunk(CHUNK_MOTO, responseData, 0, responseData.size)
    }

    private fun handleBeginTraceRequest(beginTraceRequest: BeginTraceRequest) =
        MotionToolsResponse().apply {
    private fun handleBeginTraceRequest(beginTraceRequest: BeginTraceRequest): MotionToolsResponse =
        MotionToolsResponse.newBuilder().apply {
            tryCatchingMotionToolManagerExceptions {
                beginTrace =
                    BeginTraceResponse().apply {
                        traceId = motionToolManager.beginTrace(beginTraceRequest.window.rootWindow)
                    }
            }
                setBeginTrace(BeginTraceResponse.newBuilder().setTraceId(
                        motionToolManager.beginTrace(beginTraceRequest.window.rootWindow)))
            }
        }.build()

    private fun handlePollTraceRequest(pollTraceRequest: PollTraceRequest) =
        MotionToolsResponse().apply {
    private fun handlePollTraceRequest(pollTraceRequest: PollTraceRequest): MotionToolsResponse =
        MotionToolsResponse.newBuilder().apply {
            tryCatchingMotionToolManagerExceptions {
                pollTrace =
                    PollTraceResponse().apply {
                        exportedData = motionToolManager.pollTrace(pollTraceRequest.traceId)
                    }
            }
                setPollTrace(PollTraceResponse.newBuilder()
                        .setExportedData(motionToolManager.pollTrace(pollTraceRequest.traceId)))
            }
        }.build()

    private fun handleEndTraceRequest(endTraceRequest: EndTraceRequest) =
        MotionToolsResponse().apply {
    private fun handleEndTraceRequest(endTraceRequest: EndTraceRequest): MotionToolsResponse =
        MotionToolsResponse.newBuilder().apply {
            tryCatchingMotionToolManagerExceptions {
                endTrace =
                    EndTraceResponse().apply {
                        exportedData = motionToolManager.endTrace(endTraceRequest.traceId)
                    }
            }
                setEndTrace(EndTraceResponse.newBuilder()
                        .setExportedData(motionToolManager.endTrace(endTraceRequest.traceId)))
            }
        }.build()

    private fun handleHandshakeRequest(handshakeRequest: HandshakeRequest) =
        MotionToolsResponse().apply {
            handshake =
                HandshakeResponse().apply {
                    serverVersion = SERVER_VERSION
                    status =
                        if (motionToolManager.hasWindow(handshakeRequest.window)) {
                            HandshakeResponse.OK
                        } else {
                            HandshakeResponse.WINDOW_NOT_FOUND
                        }
                }
    private fun handleHandshakeRequest(handshakeRequest: HandshakeRequest): MotionToolsResponse {
        val status = if (motionToolManager.hasWindow(handshakeRequest.window))
            HandshakeResponse.Status.OK
        else
            HandshakeResponse.Status.WINDOW_NOT_FOUND

        return MotionToolsResponse.newBuilder()
                .setHandshake(HandshakeResponse.newBuilder()
                        .setServerVersion(SERVER_VERSION)
                        .setStatus(status))
                .build()
    }

    /**
@@ -151,25 +137,25 @@ class DdmHandleMotionTool private constructor(
     * exception being caught, the error response field of the [MotionToolsResponse] is being set
     * with the according [ErrorResponse].
     */
    private fun MotionToolsResponse.tryCatchingMotionToolManagerExceptions(block: () -> Unit) {
    private fun MotionToolsResponse.Builder.tryCatchingMotionToolManagerExceptions(block: () -> Unit) {
        try {
            block()
        } catch (e: UnknownTraceIdException) {
            error = createUnknownTraceIdResponse(e.traceId)
            setError(createUnknownTraceIdResponse(e.traceId))
        } catch (e: WindowNotFoundException) {
            error = createWindowNotFoundResponse(e.windowId)
            setError(createWindowNotFoundResponse(e.windowId))
        }
    }

    private fun createUnknownTraceIdResponse(traceId: Int) =
        ErrorResponse().apply {
            this.code = ErrorResponse.UNKNOWN_TRACE_ID
        ErrorResponse.newBuilder().apply {
            this.code = ErrorResponse.Code.UNKNOWN_TRACE_ID
            this.message = "No running Trace found with traceId $traceId"
        }

    private fun createWindowNotFoundResponse(windowId: String) =
        ErrorResponse().apply {
            this.code = ErrorResponse.WINDOW_NOT_FOUND
        ErrorResponse.newBuilder().apply {
            this.code = ErrorResponse.Code.WINDOW_NOT_FOUND
            this.message = "No window found with windowId $windowId"
        }

+13 −10
Original line number Diff line number Diff line
@@ -22,9 +22,8 @@ import android.view.Choreographer
import android.view.View
import android.view.WindowManagerGlobal
import androidx.annotation.VisibleForTesting
import com.android.app.motiontool.nano.WindowIdentifier
import com.android.app.viewcapture.ViewCapture
import com.android.app.viewcapture.data.nano.ExportedData
import com.android.app.viewcapture.data.ExportedData

/**
 * Singleton to manage motion tracing sessions.
@@ -120,15 +119,19 @@ class MotionToolManager private constructor(private val windowManagerGlobal: Win
        val rootView =
            getRootView(traceMetadata.windowId)
                ?: throw WindowNotFoundException(traceMetadata.windowId)
        return viewCapture

        val exportedData = viewCapture
            .getDumpTask(rootView)
            ?.orElse(null)
            ?.get()
            ?.apply {
                frameData = frameData?.filter { it.timestamp > traceMetadata.lastPolledTime }
                    ?.toTypedArray()
            }
            ?: ExportedData()
            ?.get() ?: return ExportedData.newBuilder().build()

        val filteredFrameData = exportedData.frameDataList
                ?.filter { it.timestamp > traceMetadata.lastPolledTime }

        return exportedData.toBuilder()
                .clearFrameData()
                .addAllFrameData(filteredFrameData)
                .build()
    }

    private fun getRootView(windowId: String): View? {
@@ -146,7 +149,7 @@ private data class TraceMetadata(
    var stopTrace: () -> Unit
) {
    fun updateLastPolledTime(exportedData: ExportedData?) {
        exportedData?.frameData?.maxOfOrNull { it.timestamp }?.let { maxFrameTimestamp ->
        exportedData?.frameDataList?.maxOfOrNull { it.timestamp }?.let { maxFrameTimestamp ->
            lastPolledTime = maxFrameTimestamp
        }
    }
Loading