Skip to content

Commit 2323bd8

Browse files
NmurtasDevclaude
andcommitted
Transform SDK panel into accordion with auto-collapse feature
- Convert SDK Configuration panel to accordion pattern - Auto-collapse when SDK is already configured - Auto-expand when SDK is not configured - Add status indicator: ✓ Configured (green) / ⚠ Not Configured (orange) - Header shows ▶/▼ arrow with toggle functionality - Click header to expand/collapse SDK configuration - Improves UX by hiding SDK setup when already done - Similar pattern to existing log accordion 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent e64d5cc commit 2323bd8

1 file changed

Lines changed: 76 additions & 5 deletions

File tree

src/main/java/net/nicolamurtas/android/emulator/AndroidEmulatorManager.java

Lines changed: 76 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public class AndroidEmulatorManager extends JFrame {
3838
private JScrollPane logScrollPane;
3939
private boolean logExpanded = false;
4040

41+
// SDK accordion UI
42+
private JPanel sdkPanel;
43+
private JPanel sdkContentPanel;
44+
private boolean sdkExpanded = false;
45+
4146
// Device cards UI
4247
private JPanel devicesGridPanel;
4348
private List<EmulatorService.AvdInfo> allAvds = new ArrayList<>();
@@ -104,8 +109,38 @@ public void windowClosing(java.awt.event.WindowEvent e) {
104109
}
105110

106111
private JPanel createSdkPanel() {
107-
JPanel panel = new JPanel(new BorderLayout(5, 5));
108-
panel.setBorder(BorderFactory.createTitledBorder("SDK Configuration"));
112+
sdkPanel = new JPanel(new BorderLayout());
113+
sdkPanel.setBorder(BorderFactory.createLineBorder(UIManager.getColor("Panel.background").darker(), 1));
114+
115+
// Header panel with toggle button
116+
JPanel headerPanel = new JPanel(new BorderLayout());
117+
Color panelBg = UIManager.getColor("Panel.background");
118+
Color headerBg = panelBg != null ?
119+
(isDarkTheme() ? panelBg.brighter() : panelBg.darker()) :
120+
new Color(240, 240, 240);
121+
headerPanel.setBackground(headerBg);
122+
headerPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
123+
124+
// Check if SDK is configured to determine initial state
125+
boolean sdkConfigured = configService.isSdkConfigured();
126+
sdkExpanded = !sdkConfigured; // Collapsed if SDK is configured, expanded if not
127+
128+
JLabel sdkLabel = new JLabel(sdkExpanded ? "▼ SDK Configuration" : "▶ SDK Configuration");
129+
sdkLabel.setFont(sdkLabel.getFont().deriveFont(Font.BOLD, 13f));
130+
sdkLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
131+
sdkLabel.setForeground(UIManager.getColor("Label.foreground"));
132+
133+
// Status indicator
134+
JLabel statusLabel = new JLabel(sdkConfigured ? "✓ Configured" : "⚠ Not Configured");
135+
statusLabel.setFont(statusLabel.getFont().deriveFont(Font.PLAIN, 11f));
136+
statusLabel.setForeground(sdkConfigured ? new Color(76, 175, 80) : new Color(255, 152, 0));
137+
138+
headerPanel.add(sdkLabel, BorderLayout.WEST);
139+
headerPanel.add(statusLabel, BorderLayout.EAST);
140+
141+
// SDK content panel
142+
sdkContentPanel = new JPanel(new BorderLayout(5, 5));
143+
sdkContentPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
109144

110145
JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
111146
topPanel.add(new JLabel("SDK Path:"));
@@ -129,10 +164,46 @@ private JPanel createSdkPanel() {
129164
verifyButton.addActionListener(e -> verifySdk());
130165
buttonPanel.add(verifyButton);
131166

132-
panel.add(topPanel, BorderLayout.NORTH);
133-
panel.add(buttonPanel, BorderLayout.SOUTH);
167+
sdkContentPanel.add(topPanel, BorderLayout.NORTH);
168+
sdkContentPanel.add(buttonPanel, BorderLayout.SOUTH);
134169

135-
return panel;
170+
// Set initial visibility
171+
sdkContentPanel.setVisible(sdkExpanded);
172+
173+
// Toggle functionality
174+
headerPanel.addMouseListener(new java.awt.event.MouseAdapter() {
175+
@Override
176+
public void mouseClicked(java.awt.event.MouseEvent e) {
177+
toggleSdk(sdkLabel, statusLabel);
178+
}
179+
});
180+
181+
sdkLabel.addMouseListener(new java.awt.event.MouseAdapter() {
182+
@Override
183+
public void mouseClicked(java.awt.event.MouseEvent e) {
184+
toggleSdk(sdkLabel, statusLabel);
185+
}
186+
});
187+
188+
sdkPanel.add(headerPanel, BorderLayout.NORTH);
189+
sdkPanel.add(sdkContentPanel, BorderLayout.CENTER);
190+
191+
return sdkPanel;
192+
}
193+
194+
private void toggleSdk(JLabel label, JLabel statusLabel) {
195+
sdkExpanded = !sdkExpanded;
196+
197+
if (sdkExpanded) {
198+
label.setText("▼ SDK Configuration");
199+
sdkContentPanel.setVisible(true);
200+
} else {
201+
label.setText("▶ SDK Configuration");
202+
sdkContentPanel.setVisible(false);
203+
}
204+
205+
sdkPanel.revalidate();
206+
sdkPanel.repaint();
136207
}
137208

138209
private JPanel createAvdPanel() {

0 commit comments

Comments
 (0)