Download trace files from Winscope
Added a download file button to DataView. Bug: Test: yarn run dev Change-Id: I203f3f19168c43a0dbefb3ec00237c021380f89f Merged-In: I203f3f19168c43a0dbefb3ec00237c021380f89f
This commit is contained in:
@@ -20,8 +20,8 @@
|
|||||||
</md-whiteframe>
|
</md-whiteframe>
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<md-layout v-if="!dataLoaded" class="m-2">
|
<md-layout v-if="!dataLoaded" class="m-2">
|
||||||
<dataadb ref="adb" :store="store" @dataReady="onDataReady" @statusChange="setStatus"/>
|
<dataadb ref="adb" :store="store" @dataReady="onDataReady" @statusChange="setStatus" />
|
||||||
<datainput ref="input" :store="store" @dataReady="onDataReady" @statusChange="setStatus"/>
|
<datainput ref="input" :store="store" @dataReady="onDataReady" @statusChange="setStatus" />
|
||||||
</md-layout>
|
</md-layout>
|
||||||
<md-card v-if="dataLoaded">
|
<md-card v-if="dataLoaded">
|
||||||
<md-whiteframe md-tag="md-toolbar" md-elevation="0" class="card-toolbar md-transparent md-dense">
|
<md-whiteframe md-tag="md-toolbar" md-elevation="0" class="card-toolbar md-transparent md-dense">
|
||||||
@@ -87,6 +87,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
clear() {
|
clear() {
|
||||||
|
this.files.forEach(function(item) { item.destroy(); })
|
||||||
this.files = [];
|
this.files = [];
|
||||||
this.activeDataView = null;
|
this.activeDataView = null;
|
||||||
},
|
},
|
||||||
@@ -200,7 +201,7 @@ export default {
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.md-layout > .md-card {
|
.md-layout>.md-card {
|
||||||
margin: 0.5em;
|
margin: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,7 @@
|
|||||||
</md-card>
|
</md-card>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { dataFile, FILE_TYPES, DATA_TYPES } from './decode.js'
|
import { FILE_TYPES, DATA_TYPES } from './decode.js'
|
||||||
import LocalStore from './localstore.js'
|
import LocalStore from './localstore.js'
|
||||||
|
|
||||||
const STATES = {
|
const STATES = {
|
||||||
|
|||||||
@@ -52,7 +52,7 @@
|
|||||||
</md-card>
|
</md-card>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { detectAndDecode, dataFile, FILE_TYPES, DATA_TYPES } from './decode.js'
|
import { detectAndDecode, FILE_TYPES, DATA_TYPES } from './decode.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'datainput',
|
name: 'datainput',
|
||||||
|
|||||||
@@ -15,9 +15,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<md-card v-if="file">
|
<md-card v-if="file">
|
||||||
<md-card-header>
|
<md-card-header>
|
||||||
<div class="md-title">
|
<md-card-header-text>
|
||||||
<md-icon>{{file.type.icon}}</md-icon> {{file.filename}}
|
<div class="md-title">
|
||||||
</div>
|
<md-icon>{{file.type.icon}}</md-icon> {{file.filename}}
|
||||||
|
</div>
|
||||||
|
</md-card-header-text>
|
||||||
|
<md-button :href="file.blobUrl" :download="file.filename" class="md-icon-button">
|
||||||
|
<md-icon>save_alt</md-icon>
|
||||||
|
</md-button>
|
||||||
</md-card-header>
|
</md-card-header>
|
||||||
<traceview v-if="isTrace" :store="store" :file="file" ref="view" />
|
<traceview v-if="isTrace" :store="store" :file="file" ref="view" />
|
||||||
<videoview v-if="isVideo" :file="file" ref="view" />
|
<videoview v-if="isVideo" :file="file" ref="view" />
|
||||||
@@ -50,15 +55,15 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
isTrace() {
|
isTrace() {
|
||||||
return this.file.type == DATA_TYPES.WINDOW_MANAGER ||
|
return this.file.type == DATA_TYPES.WINDOW_MANAGER ||
|
||||||
this.file.type == DATA_TYPES.SURFACE_FLINGER ||
|
this.file.type == DATA_TYPES.SURFACE_FLINGER ||
|
||||||
this.file.type == DATA_TYPES.TRANSACTION || this.file.type == DATA_TYPES.WAYLAND
|
this.file.type == DATA_TYPES.TRANSACTION || this.file.type == DATA_TYPES.WAYLAND
|
||||||
},
|
},
|
||||||
isVideo() {
|
isVideo() {
|
||||||
return this.file.type == DATA_TYPES.SCREEN_RECORDING;
|
return this.file.type == DATA_TYPES.SCREEN_RECORDING;
|
||||||
},
|
},
|
||||||
isLog() {
|
isLog() {
|
||||||
return this.file.type == DATA_TYPES.WINDOW_LOG
|
return this.file.type == DATA_TYPES.WINDOW_LOG
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
'traceview': TraceView,
|
'traceview': TraceView,
|
||||||
@@ -74,4 +79,5 @@ export default {
|
|||||||
font-size: 4em;
|
font-size: 4em;
|
||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<h2 class="md-title">Screen</h2>
|
<h2 class="md-title">Screen</h2>
|
||||||
</md-whiteframe>
|
</md-whiteframe>
|
||||||
<md-whiteframe md-elevation="8">
|
<md-whiteframe md-elevation="8">
|
||||||
<video :id="file.filename" class="screen" :src="videoUri" />
|
<video :id="file.filename" class="screen" :src="file.data" />
|
||||||
</md-whiteframe>
|
</md-whiteframe>
|
||||||
</md-card>
|
</md-card>
|
||||||
</md-card-content>
|
</md-card-content>
|
||||||
@@ -63,9 +63,6 @@ export default {
|
|||||||
selectedIndex() {
|
selectedIndex() {
|
||||||
return this.file.selectedIndex;
|
return this.file.selectedIndex;
|
||||||
},
|
},
|
||||||
videoUri() {
|
|
||||||
return "data:video/mp4;base64," + btoa(uint8ToString(this.file.data));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,26 +59,32 @@ const DATA_TYPES = {
|
|||||||
WINDOW_MANAGER: {
|
WINDOW_MANAGER: {
|
||||||
name: "WindowManager",
|
name: "WindowManager",
|
||||||
icon: "view_compact",
|
icon: "view_compact",
|
||||||
|
mime: "application/octet-stream",
|
||||||
},
|
},
|
||||||
SURFACE_FLINGER: {
|
SURFACE_FLINGER: {
|
||||||
name: "SurfaceFlinger",
|
name: "SurfaceFlinger",
|
||||||
icon: "filter_none",
|
icon: "filter_none",
|
||||||
|
mime: "application/octet-stream",
|
||||||
},
|
},
|
||||||
SCREEN_RECORDING: {
|
SCREEN_RECORDING: {
|
||||||
name: "Screen recording",
|
name: "Screen recording",
|
||||||
icon: "videocam",
|
icon: "videocam",
|
||||||
|
mime: "video/mp4",
|
||||||
},
|
},
|
||||||
TRANSACTION: {
|
TRANSACTION: {
|
||||||
name: "Transaction",
|
name: "Transaction",
|
||||||
icon: "timeline",
|
icon: "timeline",
|
||||||
|
mime: "application/octet-stream",
|
||||||
},
|
},
|
||||||
WAYLAND: {
|
WAYLAND: {
|
||||||
name: "Wayland",
|
name: "Wayland",
|
||||||
icon: "filter_none",
|
icon: "filter_none",
|
||||||
|
mime: "application/octet-stream",
|
||||||
},
|
},
|
||||||
WINDOW_LOG: {
|
WINDOW_LOG: {
|
||||||
name: "WindowManager log",
|
name: "WindowManager log",
|
||||||
icon: "notes",
|
icon: "notes",
|
||||||
|
mime: "application/octet-stream",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,21 +225,27 @@ function protoDecoder(buffer, fileType, fileName, store) {
|
|||||||
} else {
|
} else {
|
||||||
data = [transformed];
|
data = [transformed];
|
||||||
}
|
}
|
||||||
return dataFile(fileName, data.map(x => x.timestamp), data, fileType.dataType);
|
let blobUrl = URL.createObjectURL(new Blob([buffer], { type: fileType.dataType.mime }));
|
||||||
|
return dataFile(fileName, data.map(x => x.timestamp), data, blobUrl, fileType.dataType);
|
||||||
}
|
}
|
||||||
|
|
||||||
function videoDecoder(buffer, fileType, fileName, store) {
|
function videoDecoder(buffer, fileType, fileName, store) {
|
||||||
var [data, timeline] = fileType.decoderParams.videoDecoder(buffer)
|
let [data, timeline] = fileType.decoderParams.videoDecoder(buffer);
|
||||||
return dataFile(fileName, timeline, data, fileType.dataType);
|
let blobUrl = URL.createObjectURL(new Blob([data], { type: fileType.dataType.mime }));
|
||||||
|
return dataFile(fileName, timeline, blobUrl, blobUrl, fileType.dataType);
|
||||||
}
|
}
|
||||||
|
|
||||||
function dataFile(filename, timeline, data, type) {
|
function dataFile(filename, timeline, data, blobUrl, type) {
|
||||||
return {
|
return {
|
||||||
filename: filename,
|
filename: filename,
|
||||||
timeline: timeline,
|
timeline: timeline,
|
||||||
data: data,
|
data: data,
|
||||||
|
blobUrl: blobUrl,
|
||||||
type: type,
|
type: type,
|
||||||
selectedIndex: 0,
|
selectedIndex: 0,
|
||||||
|
destroy() {
|
||||||
|
URL.revokeObjectURL(this.blobUrl);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,4 +295,4 @@ function detectAndDecode(buffer, fileName, store) {
|
|||||||
throw new Error('Unable to detect file');
|
throw new Error('Unable to detect file');
|
||||||
}
|
}
|
||||||
|
|
||||||
export { detectAndDecode, dataFile, DATA_TYPES, FILE_TYPES };
|
export { detectAndDecode, DATA_TYPES, FILE_TYPES };
|
||||||
|
|||||||
Reference in New Issue
Block a user