package com.android.preload.ui; import com.android.ddmlib.Client; import com.android.ddmlib.ClientData; import java.io.File; import java.util.LinkedList; import java.util.List; import javax.swing.Action; import javax.swing.ListModel; import javax.swing.table.TableModel; public class SequenceUI implements IUI { private ListModel clientListModel; @SuppressWarnings("unused") private TableModel dataTableModel; private List actions; private List sequence = new LinkedList<>(); public SequenceUI() { } @Override public boolean isSingleThreaded() { return true; } @Override public void prepare(ListModel clientListModel, TableModel dataTableModel, List actions) { this.clientListModel = clientListModel; this.dataTableModel = dataTableModel; this.actions = actions; } public SequenceUI action(Action a) { sequence.add(a); return this; } public SequenceUI action(Class actionClass) { for (Action a : actions) { if (actionClass.equals(a.getClass())) { sequence.add(a); return this; } } throw new IllegalArgumentException("No action of class " + actionClass + " found."); } public SequenceUI confirmYes() { sequence.add(Boolean.TRUE); return this; } public SequenceUI confirmNo() { sequence.add(Boolean.FALSE); return this; } public SequenceUI input(String input) { sequence.add(input); return this; } public SequenceUI input(File... f) { sequence.add(f); return this; } public SequenceUI output(File f) { sequence.add(f); return this; } public SequenceUI tableRow(int i) { sequence.add(i); return this; } private class ClientSelector { private String pkg; public ClientSelector(String pkg) { this.pkg = pkg; } public Client getClient() { for (int i = 0; i < clientListModel.getSize(); i++) { ClientData cd = clientListModel.getElementAt(i).getClientData(); if (cd != null) { String s = cd.getClientDescription(); if (pkg.equals(s)) { return clientListModel.getElementAt(i); } } } throw new RuntimeException("Didn't find client " + pkg); } } public SequenceUI client(String pkg) { sequence.add(new ClientSelector(pkg)); return this; } public SequenceUI choice(String pattern) { sequence.add(pattern); return this; } @Override public void ready() { // Run the actions. // No iterator or foreach loop as the sequence will be emptied while running. try { while (!sequence.isEmpty()) { Object next = sequence.remove(0); if (next instanceof Action) { ((Action)next).actionPerformed(null); } else { throw new IllegalStateException("Didn't expect a non-action: " + next); } } } catch (Exception e) { e.printStackTrace(System.out); } // Now shut down. System.exit(0); } @Override public Client getSelectedClient() { Object next = sequence.remove(0); if (next instanceof ClientSelector) { return ((ClientSelector)next).getClient(); } throw new IllegalStateException("Unexpected: " + next); } @Override public int getSelectedDataTableRow() { Object next = sequence.remove(0); if (next instanceof Integer) { return ((Integer)next).intValue(); } throw new IllegalStateException("Unexpected: " + next); } @Override public void showWaitDialog() { } @Override public void updateWaitDialog(String s) { System.out.println(s); } @Override public void hideWaitDialog() { } @Override public void showMessageDialog(String s) { System.out.println(s); } @Override public boolean showConfirmDialog(String title, String message) { Object next = sequence.remove(0); if (next instanceof Boolean) { return ((Boolean)next).booleanValue(); } throw new IllegalStateException("Unexpected: " + next); } @Override public String showInputDialog(String message) { Object next = sequence.remove(0); if (next instanceof String) { return (String)next; } throw new IllegalStateException("Unexpected: " + next); } @Override public T showChoiceDialog(String title, String message, T[] choices) { Object next = sequence.remove(0); if (next instanceof String) { String s = (String)next; for (T t : choices) { if (t.toString().contains(s)) { return t; } } return null; } throw new IllegalStateException("Unexpected: " + next); } @Override public File showSaveDialog() { Object next = sequence.remove(0); if (next instanceof File) { System.out.println(next); return (File)next; } throw new IllegalStateException("Unexpected: " + next); } @Override public File[] showOpenDialog(boolean multi) { Object next = sequence.remove(0); if (next instanceof File[]) { return (File[])next; } throw new IllegalStateException("Unexpected: " + next); } }