use of com.android.tools.adtui.model.RangedContinuousSeries in project android by JetBrains.
the class CpuMonitorView method populateUi.
@Override
protected void populateUi(JPanel container, Choreographer choreographer) {
container.setLayout(new TabularLayout("*", "*"));
Range viewRange = getMonitor().getTimeline().getViewRange();
Range dataRange = getMonitor().getTimeline().getDataRange();
final JLabel label = new JLabel(getMonitor().getName());
label.setBorder(MONITOR_LABEL_PADDING);
label.setVerticalAlignment(JLabel.TOP);
// Cpu usage is shown as percentages (e.g. 0 - 100) and no range animation is needed.
Range leftYRange = new Range(0, 100);
final JPanel axisPanel = new JBPanel(new BorderLayout());
axisPanel.setOpaque(false);
AxisComponent.Builder builder = new AxisComponent.Builder(leftYRange, CPU_USAGE_AXIS, AxisComponent.AxisOrientation.RIGHT).showAxisLine(false).showMax(true).showUnitAtMax(true).setMarkerLengths(MARKER_LENGTH, MARKER_LENGTH).clampToMajorTicks(true).setMargins(0, Y_AXIS_TOP_MARGIN);
final AxisComponent leftAxis = builder.build();
axisPanel.add(leftAxis, BorderLayout.WEST);
final JPanel lineChartPanel = new JBPanel(new BorderLayout());
lineChartPanel.setOpaque(false);
lineChartPanel.setBorder(BorderFactory.createEmptyBorder(Y_AXIS_TOP_MARGIN, 0, 0, 0));
final LineChart lineChart = new LineChart();
RangedContinuousSeries cpuSeries = new RangedContinuousSeries("CPU", viewRange, leftYRange, getMonitor().getThisProcessCpuUsage());
lineChart.addLine(cpuSeries, new LineConfig(ProfilerColors.CPU_USAGE).setFilled(true));
lineChartPanel.add(lineChart, BorderLayout.CENTER);
final LegendComponent legend = new LegendComponent(LegendComponent.Orientation.HORIZONTAL, LEGEND_UPDATE_FREQUENCY_MS);
legend.setLegendData(Collections.singletonList(lineChart.createLegendRenderData(cpuSeries, CPU_USAGE_AXIS, dataRange)));
final JPanel legendPanel = new JBPanel(new BorderLayout());
legendPanel.setOpaque(false);
legendPanel.add(label, BorderLayout.WEST);
legendPanel.add(legend, BorderLayout.EAST);
choreographer.register(lineChart);
choreographer.register(leftAxis);
choreographer.register(legend);
container.add(legendPanel, new TabularLayout.Constraint(0, 0));
container.add(leftAxis, new TabularLayout.Constraint(0, 0));
container.add(lineChartPanel, new TabularLayout.Constraint(0, 0));
container.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
getMonitor().expand();
}
});
}
use of com.android.tools.adtui.model.RangedContinuousSeries in project android by JetBrains.
the class ThreadCallsVisualTest method actionPerformed.
/**
* Invoked when an action occurs.
*/
@Override
public void actionPerformed(ActionEvent e) {
if (ACTION_START_RECORDING.equals(e.getActionCommand())) {
if (mSampler == null) {
mSampler = new Sampler();
}
mSampler.startSampling();
mRecordButton.setActionCommand(ACTION_STOP_RECORDING);
mRecordButton.setText("Stop Recording");
} else if (ACTION_STOP_RECORDING.equals(e.getActionCommand())) {
mSampler.stopSampling();
mRecordButton.setActionCommand(ACTION_START_RECORDING);
mRecordButton.setText("Record");
setData(mSampler.getData());
} else if (ACTION_SAVE_RECORDING.equals(e.getActionCommand())) {
} else if (ACTION_LOAD_RECORDING.equals(e.getActionCommand())) {
} else if (ACTION_THREAD_SELECTED.equals(e.getActionCommand())) {
int selected = mComboBox.getSelectedIndex();
if (selected >= 0 && selected < mComboBox.getItemCount()) {
String threadName = (String) mComboBox.getSelectedItem();
mtree = forest.get(threadName);
mChart.setHTree(mtree);
double start = mtree.getFirstChild().getStart();
double end = mtree.getLastChild().getEnd();
mTimeGlobalRangeUs.setMin(start);
mTimeGlobalRangeUs.setMax(end);
mTimeSelectionRangeUs.setMin(start);
mTimeSelectionRangeUs.setMax(end);
// Generate dummy values to simulate CPU Load.
LongDataSeries series = new LongDataSeries();
RangedContinuousSeries rangedSeries = new RangedContinuousSeries("Threads", mTimeGlobalRangeUs, new Range(0.0, 200.0), series);
Random r = new Random(System.currentTimeMillis());
for (int i = 0; i < 100; i++) {
series.add((long) (start + (end - start) / 100 * i), (long) r.nextInt(100));
}
mLineChart.addLine(rangedSeries);
mScrollBar.setValues(0, mChart.getHeight(), 0, mChart.getMaximumHeight());
}
}
}
use of com.android.tools.adtui.model.RangedContinuousSeries in project android by JetBrains.
the class MemoryMonitorView method populateUi.
@Override
protected void populateUi(JPanel container, Choreographer choreographer) {
container.setLayout(new TabularLayout("*", "*"));
Range viewRange = getMonitor().getTimeline().getViewRange();
Range dataRange = getMonitor().getTimeline().getDataRange();
final JLabel label = new JLabel(getMonitor().getName());
label.setBorder(MONITOR_LABEL_PADDING);
label.setVerticalAlignment(JLabel.TOP);
Range leftYRange = new Range(0, 0);
final JPanel axisPanel = new JBPanel(new BorderLayout());
axisPanel.setOpaque(false);
AxisComponent.Builder builder = new AxisComponent.Builder(leftYRange, MEMORY_AXIS_FORMATTER, AxisComponent.AxisOrientation.RIGHT).showAxisLine(false).showMax(true).showUnitAtMax(true).clampToMajorTicks(true).setMarkerLengths(MARKER_LENGTH, MARKER_LENGTH).setMargins(0, Y_AXIS_TOP_MARGIN);
final AxisComponent leftAxis = builder.build();
axisPanel.add(leftAxis, BorderLayout.WEST);
final JPanel lineChartPanel = new JBPanel(new BorderLayout());
lineChartPanel.setOpaque(false);
lineChartPanel.setBorder(BorderFactory.createEmptyBorder(Y_AXIS_TOP_MARGIN, 0, 0, 0));
final LineChart lineChart = new LineChart();
RangedContinuousSeries memSeries = new RangedContinuousSeries("Memory", viewRange, leftYRange, getMonitor().getTotalMemory());
lineChart.addLine(memSeries, new LineConfig(ProfilerColors.MEMORY_TOTAL).setFilled(true));
lineChartPanel.add(lineChart, BorderLayout.CENTER);
final LegendComponent legend = new LegendComponent(LegendComponent.Orientation.HORIZONTAL, LEGEND_UPDATE_FREQUENCY_MS);
legend.setLegendData(Collections.singletonList(lineChart.createLegendRenderData(memSeries, MEMORY_AXIS_FORMATTER, dataRange)));
final JPanel legendPanel = new JBPanel(new BorderLayout());
legendPanel.setOpaque(false);
legendPanel.add(label, BorderLayout.WEST);
legendPanel.add(legend, BorderLayout.EAST);
choreographer.register(lineChart);
choreographer.register(leftAxis);
choreographer.register(legend);
container.add(legendPanel, new TabularLayout.Constraint(0, 0));
container.add(leftAxis, new TabularLayout.Constraint(0, 0));
container.add(lineChartPanel, new TabularLayout.Constraint(0, 0));
container.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
getMonitor().expand();
}
});
}
use of com.android.tools.adtui.model.RangedContinuousSeries in project android by JetBrains.
the class NetworkProfilerStageView method buildMonitorUi.
@NotNull
private JPanel buildMonitorUi() {
StudioProfilers profilers = getStage().getStudioProfilers();
ProfilerTimeline timeline = profilers.getTimeline();
Range viewRange = getTimeline().getViewRange();
Range dataRange = getTimeline().getDataRange();
EventMonitor events = new EventMonitor(profilers);
NetworkMonitor monitor = new NetworkMonitor(getStage().getStudioProfilers());
TabularLayout layout = new TabularLayout("*");
JPanel panel = new JBPanel(layout);
panel.setBackground(ProfilerColors.MONITOR_BACKGROUND);
// The scrollbar can modify the view range - so it should be registered to the Choreographer before all other Animatables
// that attempts to read the same range instance.
ProfilerScrollbar sb = new ProfilerScrollbar(getChoreographer(), timeline, panel);
getChoreographer().register(sb);
panel.add(sb, new TabularLayout.Constraint(4, 0));
AxisComponent timeAxis = buildTimeAxis(profilers);
getChoreographer().register(timeAxis);
panel.add(timeAxis, new TabularLayout.Constraint(3, 0));
EventMonitorView eventsView = new EventMonitorView(events);
JComponent eventsComponent = eventsView.initialize(getChoreographer());
panel.add(eventsComponent, new TabularLayout.Constraint(0, 0));
panel.add(new NetworkRadioView(this).getComponent(), new TabularLayout.Constraint(1, 0));
JPanel monitorPanel = new JBPanel(new TabularLayout("*", "*"));
monitorPanel.setOpaque(false);
monitorPanel.setBorder(MONITOR_BORDER);
final JLabel label = new JLabel(monitor.getName());
label.setBorder(MONITOR_LABEL_PADDING);
label.setVerticalAlignment(SwingConstants.TOP);
Range leftYRange = new Range(0, 4);
Range rightYRange = new Range(0, 5);
RangedContinuousSeries receivedSeries = new RangedContinuousSeries(NetworkTrafficDataSeries.Type.BYTES_RECEIVED.getLabel(), viewRange, leftYRange, monitor.getSpeedSeries(NetworkTrafficDataSeries.Type.BYTES_RECEIVED));
RangedContinuousSeries sentSeries = new RangedContinuousSeries(NetworkTrafficDataSeries.Type.BYTES_SENT.getLabel(), viewRange, leftYRange, monitor.getSpeedSeries(NetworkTrafficDataSeries.Type.BYTES_SENT));
RangedContinuousSeries connectionSeries = new RangedContinuousSeries("Connections", viewRange, rightYRange, monitor.getOpenConnectionsSeries());
final JPanel lineChartPanel = new JBPanel(new BorderLayout());
lineChartPanel.setOpaque(false);
lineChartPanel.setBorder(BorderFactory.createEmptyBorder(Y_AXIS_TOP_MARGIN, 0, 0, 0));
final LineChart lineChart = new LineChart();
LineConfig receivedConfig = new LineConfig(ProfilerColors.NETWORK_RECEIVING_COLOR);
lineChart.addLine(receivedSeries, receivedConfig);
LineConfig sentConfig = new LineConfig(ProfilerColors.NETWORK_SENDING_COLOR);
lineChart.addLine(sentSeries, sentConfig);
LineConfig connectionConfig = new LineConfig(ProfilerColors.NETWORK_CONNECTIONS_COLOR).setStroke(LineConfig.DEFAULT_DASH_STROKE);
lineChart.addLine(connectionSeries, connectionConfig);
getChoreographer().register(lineChart);
lineChartPanel.add(lineChart, BorderLayout.CENTER);
final JPanel axisPanel = new JBPanel(new BorderLayout());
axisPanel.setOpaque(false);
AxisComponent.Builder leftAxisBuilder = new AxisComponent.Builder(leftYRange, TRAFFIC_AXIS_FORMATTER, AxisComponent.AxisOrientation.RIGHT).showAxisLine(false).showMax(true).showUnitAtMax(true).setMarkerLengths(MARKER_LENGTH, MARKER_LENGTH).clampToMajorTicks(true).setMargins(0, Y_AXIS_TOP_MARGIN);
final AxisComponent leftAxis = leftAxisBuilder.build();
getChoreographer().register(leftAxis);
axisPanel.add(leftAxis, BorderLayout.WEST);
AxisComponent.Builder rightAxisBuilder = new AxisComponent.Builder(rightYRange, CONNECTIONS_AXIS_FORMATTER, AxisComponent.AxisOrientation.LEFT).showAxisLine(false).showMax(true).showUnitAtMax(true).setMarkerLengths(MARKER_LENGTH, MARKER_LENGTH).clampToMajorTicks(true).setMargins(0, Y_AXIS_TOP_MARGIN);
final AxisComponent rightAxis = rightAxisBuilder.build();
getChoreographer().register(rightAxis);
axisPanel.add(rightAxis, BorderLayout.EAST);
final LegendComponent legend = new LegendComponent(LegendComponent.Orientation.HORIZONTAL, LEGEND_UPDATE_FREQUENCY_MS);
ArrayList<LegendRenderData> legendData = new ArrayList<>();
legendData.add(lineChart.createLegendRenderData(receivedSeries, TRAFFIC_AXIS_FORMATTER, dataRange));
legendData.add(lineChart.createLegendRenderData(sentSeries, TRAFFIC_AXIS_FORMATTER, dataRange));
legendData.add(lineChart.createLegendRenderData(connectionSeries, CONNECTIONS_AXIS_FORMATTER, dataRange));
legend.setLegendData(legendData);
getChoreographer().register(legend);
final JPanel legendPanel = new JBPanel(new BorderLayout());
legendPanel.setOpaque(false);
legendPanel.add(label, BorderLayout.WEST);
legendPanel.add(legend, BorderLayout.EAST);
SelectionComponent selection = new SelectionComponent(timeline.getSelectionRange(), timeline.getViewRange());
selection.addChangeListener(this::onSelectionChanged);
getChoreographer().register(selection);
monitorPanel.add(selection, new TabularLayout.Constraint(0, 0));
monitorPanel.add(legendPanel, new TabularLayout.Constraint(0, 0));
monitorPanel.add(axisPanel, new TabularLayout.Constraint(0, 0));
monitorPanel.add(lineChartPanel, new TabularLayout.Constraint(0, 0));
// Give as much space as possible to the main monitor panel
layout.setRowSizing(2, "*");
panel.add(monitorPanel, new TabularLayout.Constraint(2, 0));
return panel;
}
use of com.android.tools.adtui.model.RangedContinuousSeries in project android by JetBrains.
the class LineChart method updateData.
@Override
protected void updateData() {
Map<Range, Double> max = new HashMap<>();
// TODO Handle stacked configs
for (RangedContinuousSeries ranged : myLinesConfig.keySet()) {
Range range = ranged.getYRange();
double yMax = Double.MIN_VALUE;
ImmutableList<SeriesData<Long>> seriesList = ranged.getSeries();
for (int i = 0; i < seriesList.size(); i++) {
double value = seriesList.get(i).value;
if (yMax < value) {
yMax = value;
}
}
Double m = max.get(range);
max.put(range, m == null ? yMax : Math.max(yMax, m));
}
for (Map.Entry<Range, Double> entry : max.entrySet()) {
Range range = entry.getKey();
// Prevent the LineChart to update the range below its current max.
if (range.getMax() < entry.getValue()) {
float fraction = myFirstUpdate ? 1f : DEFAULT_LERP_FRACTION;
range.setMax(Choreographer.lerp(range.getMax(), entry.getValue(), fraction, mFrameLength, (float) (entry.getValue() * DEFAULT_LERP_THRESHOLD_PERCENTAGE)));
}
}
myFirstUpdate = false;
}
Aggregations