diff options
author | Hannah Chu <hanchu@google.com> | 2022-07-01 16:48:35 -0700 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-07-18 19:28:20 +0000 |
commit | 570f780e4a7c14a8616d5f372556f83ff7c7d925 (patch) | |
tree | 93bac8edfc43fa663b4da8f78b2b2d6953a4803c | |
parent | 0d0a6a4bce6a18dc6c7d8fce2e7463271ee5eabf (diff) | |
download | idea-570f780e4a7c14a8616d5f372556f83ff7c7d925.tar.gz |
[DM] Show error when AVD is not OK
Bug: 195485594
Test: VirtualDeviceTableCellRenderer
Change-Id: If2c2ce2fc00dc48703195d438dea4ace2bbe3568
4 files changed, 103 insertions, 11 deletions
diff --git a/device-manager/src/com/android/tools/idea/devicemanager/DeviceTableCellRenderer.java b/device-manager/src/com/android/tools/idea/devicemanager/DeviceTableCellRenderer.java index 43078d159a3..ed4c8d4d8c7 100644 --- a/device-manager/src/com/android/tools/idea/devicemanager/DeviceTableCellRenderer.java +++ b/device-manager/src/com/android/tools/idea/devicemanager/DeviceTableCellRenderer.java @@ -52,7 +52,7 @@ public class DeviceTableCellRenderer<D extends Device> implements TableCellRende private final @NotNull JLabel myIconLabel; private final @NotNull JLabel myNameLabel; - private final @NotNull JLabel myOnlineLabel; + private final @NotNull JLabel myStateLabel; private final @NotNull JLabel myLine2Label; private final @NotNull JLabel myPairedLabel; private final @NotNull JComponent myPanel; @@ -68,7 +68,7 @@ public class DeviceTableCellRenderer<D extends Device> implements TableCellRende myIconLabel = new JBLabel(); myNameLabel = new JBLabel(); - myOnlineLabel = new JBLabel(); + myStateLabel = new JBLabel(); myLine2Label = new JBLabel(); myPairedLabel = new JBLabel(); @@ -82,7 +82,7 @@ public class DeviceTableCellRenderer<D extends Device> implements TableCellRende .addGroup(layout.createSequentialGroup() .addComponent(myNameLabel, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(myOnlineLabel)) + .addComponent(myStateLabel)) .addComponent(myLine2Label, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(myPairedLabel) @@ -94,7 +94,7 @@ public class DeviceTableCellRenderer<D extends Device> implements TableCellRende .addGroup(layout.createParallelGroup(Alignment.CENTER) .addComponent(myIconLabel) .addComponent(myNameLabel) - .addComponent(myOnlineLabel)) + .addComponent(myStateLabel)) .addComponent(myLine2Label) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(myPairedLabel); @@ -121,8 +121,8 @@ public class DeviceTableCellRenderer<D extends Device> implements TableCellRende myNameLabel.setForeground(foreground); myNameLabel.setText(getName(device)); - myOnlineLabel.setForeground(foreground); - setIcon(myOnlineLabel, device.isOnline() ? StudioIcons.Avd.STATUS_DECORATOR_ONLINE : null, selected); + myStateLabel.setForeground(foreground); + setIcon(myStateLabel, getStateIcon(device), selected); myLine2Label.setFont(UIUtil.getLabelFont(FontSize.SMALL)); myLine2Label.setForeground(brighten(foreground)); @@ -181,6 +181,10 @@ public class DeviceTableCellRenderer<D extends Device> implements TableCellRende return device.getName(); } + protected @Nullable Icon getStateIcon(@NotNull D device) { + return device.isOnline() ? StudioIcons.Avd.STATUS_DECORATOR_ONLINE : null; + } + protected @NotNull String getLine2(@NotNull D device) { return device.getTarget(); } @@ -220,12 +224,12 @@ public class DeviceTableCellRenderer<D extends Device> implements TableCellRende } @VisibleForTesting - final @NotNull JLabel getOnlineLabel() { - return myOnlineLabel; + public final @NotNull JLabel getStateLabel() { + return myStateLabel; } @VisibleForTesting - final @NotNull JLabel getLine2Label() { + public final @NotNull JLabel getLine2Label() { return myLine2Label; } diff --git a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceTableCellRenderer.java b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceTableCellRenderer.java index 3b3c9790ee2..a611933325e 100644 --- a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceTableCellRenderer.java +++ b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceTableCellRenderer.java @@ -15,8 +15,13 @@ */ package com.android.tools.idea.devicemanager.virtualtab; +import com.android.sdklib.internal.avd.AvdInfo; +import com.android.sdklib.internal.avd.AvdInfo.AvdStatus; import com.android.tools.idea.devicemanager.DeviceTableCellRenderer; +import icons.StudioIcons; +import javax.swing.Icon; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; final class VirtualDeviceTableCellRenderer extends DeviceTableCellRenderer<VirtualDevice> { VirtualDeviceTableCellRenderer() { @@ -24,7 +29,25 @@ final class VirtualDeviceTableCellRenderer extends DeviceTableCellRenderer<Virtu } @Override + protected @Nullable Icon getStateIcon(@NotNull VirtualDevice device) { + if (!device.getAvdInfo().getStatus().equals(AvdStatus.OK)) { + return StudioIcons.Common.WARNING_INLINE; + } + + return super.getStateIcon(device); + } + + @Override protected @NotNull String getLine2(@NotNull VirtualDevice device) { + AvdInfo avd = device.getAvdInfo(); + + if (!avd.getStatus().equals(AvdStatus.OK)) { + String message = avd.getErrorMessage(); + + assert message != null; + return message; + } + return device.getTarget() + " | " + device.getCpuArchitecture(); } } diff --git a/device-manager/testSrc/com/android/tools/idea/devicemanager/DeviceTableCellRendererTest.java b/device-manager/testSrc/com/android/tools/idea/devicemanager/DeviceTableCellRendererTest.java index 7394577f240..29b5d0b3ade 100644 --- a/device-manager/testSrc/com/android/tools/idea/devicemanager/DeviceTableCellRendererTest.java +++ b/device-manager/testSrc/com/android/tools/idea/devicemanager/DeviceTableCellRendererTest.java @@ -54,7 +54,7 @@ public final class DeviceTableCellRendererTest { // Assert assertEquals(TestPhysicalDevices.ONLINE_GOOGLE_PIXEL_3.getIcon(), renderer.getIconLabel().getIcon()); assertEquals(TestPhysicalDevices.ONLINE_GOOGLE_PIXEL_3.getName(), renderer.getNameLabel().getText()); - assertEquals(StudioIcons.Avd.STATUS_DECORATOR_ONLINE, renderer.getOnlineLabel().getIcon()); + assertEquals(StudioIcons.Avd.STATUS_DECORATOR_ONLINE, renderer.getStateLabel().getIcon()); assertEquals(TestPhysicalDevices.ONLINE_GOOGLE_PIXEL_3.getTarget(), renderer.getLine2Label().getText()); } @@ -121,7 +121,7 @@ public final class DeviceTableCellRendererTest { // Assert assertEquals(TestPhysicalDevices.GOOGLE_PIXEL_3.getIcon(), renderer.getIconLabel().getIcon()); assertEquals(TestPhysicalDevices.GOOGLE_PIXEL_3.getName(), renderer.getNameLabel().getText()); - assertNull(renderer.getOnlineLabel().getIcon()); + assertNull(renderer.getStateLabel().getIcon()); assertEquals(TestPhysicalDevices.GOOGLE_PIXEL_3.getTarget(), renderer.getLine2Label().getText()); } diff --git a/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceTableCellRendererTest.java b/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceTableCellRendererTest.java new file mode 100644 index 00000000000..b23fb832b72 --- /dev/null +++ b/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceTableCellRendererTest.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.tools.idea.devicemanager.virtualtab; + +import static org.junit.Assert.assertEquals; + +import com.android.sdklib.internal.avd.AvdInfo; +import com.android.sdklib.internal.avd.AvdInfo.AvdStatus; +import com.android.tools.idea.devicemanager.DeviceTableCellRenderer; +import com.intellij.ui.table.JBTable; +import icons.StudioIcons; +import javax.swing.JTable; +import org.jetbrains.annotations.NotNull; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mockito; + +@RunWith(JUnit4.class) +public final class VirtualDeviceTableCellRendererTest { + private final @NotNull AvdInfo myAvd = Mockito.mock(AvdInfo.class); + private final @NotNull DeviceTableCellRenderer<@NotNull VirtualDevice> myRenderer = new VirtualDeviceTableCellRenderer(); + private final @NotNull JTable myTable = new JBTable(); + private final @NotNull Object myDevice = TestVirtualDevices.onlinePixel5Api31(myAvd); + + @Test + public void getTableCellRendererComponentStatusDoesntEqualOk() { + // Arrange + Mockito.when(myAvd.getStatus()).thenReturn(AvdStatus.ERROR_IMAGE_MISSING); + Mockito.when(myAvd.getErrorMessage()).thenReturn("Missing system image for x86_64 Pixel 5."); + + // Act + myRenderer.getTableCellRendererComponent(myTable, myDevice, false, false, 0, 0); + + // Assert + assertEquals(StudioIcons.Common.WARNING_INLINE, myRenderer.getStateLabel().getIcon()); + assertEquals("Missing system image for x86_64 Pixel 5.", myRenderer.getLine2Label().getText()); + } + + @Test + public void getTableCellRendererComponent() { + // Arrange + Mockito.when(myAvd.getStatus()).thenReturn(AvdStatus.OK); + + // Act + myRenderer.getTableCellRendererComponent(myTable, myDevice, false, false, 0, 0); + + // Assert + assertEquals(StudioIcons.Avd.STATUS_DECORATOR_ONLINE, myRenderer.getStateLabel().getIcon()); + assertEquals("Android 12.0 Google APIs | x86_64", myRenderer.getLine2Label().getText()); + } +} |