[Demonstration 1]

[Buggy Method]
public boolean isSpaceKey(int keyIndex) {
    Key key = getKey(keyIndex);
    return key != null && key.codes != null && key.codes[0] == LatinIME.ASCII_SPACE;
}

[Buggy Hunk]
return key != null && key.codes != null && key.codes[0] == LatinIME.ASCII_SPACE;

[Patch]
return key != null && key.codes != null && key.codes.length > 0 && key.codes[0] == LatinIME.ASCII_SPACE;

[Demonstration 2]

[Buggy Method]
public static boolean available(Context context) {
    try {
        return Class.forName("com.xiaomi.mipush.sdk.MiPushClient") != null && Class.forName("com.yy.httpproxy.thirdparty.XiaomiReceiver") != null && ServiceCheckUtil.isServiceAvailable(context, XiaomiReceiver.class) && getMetaDataValue(context, "XIAOMI_APP_ID") != null && getMetaDataValue(context, "XIAOMI_APP_ID") != null;
    } catch (Throwable e) {
        Log.e(TAG, "available ", e);
        return false;
    }
}

[Buggy Hunk]
&& ServiceCheckUtil.isServiceAvailable(context, XiaomiReceiver.class) && getMetaDataValue(context, "XIAOMI_APP_ID") != null && getMetaDataValue(context, "XIAOMI_APP_ID") != null;

[Patch]
&& ServiceCheckUtil.isBroadcastReceiverAvailable(context, XiaomiReceiver.class) && getMetaDataValue(context, "XIAOMI_APP_ID") != null && getMetaDataValue(context, "XIAOMI_APP_ID") != null;

[Demonstration 3]

[Buggy Method]
private void activate() {
    this.setVisible(false);
    this.getContentPane().removeAll();
    this.setSize(700, 200 + 25 * spikeTrader.getPairs().size());
    this.setLayout(new GridBagLayout());
    currencySelected = new JLabel("Currency: " + Arrays.toString(spikeTrader.getCurrencies()));
    eventDateSelected = new JLabel("Event Date: " + spikeTrader.getEventDate());
    accountUtilizationSelected = new JLabel("Account Utilization: " + spikeTrader.getAccountUtilization() * 100 + "%");
    autoStartDateSelected = new JLabel("Auto Start Time: " + (spikeTrader.autoStartEnabled() ? spikeTrader.getAutoStartDate() : "N/A"));
    expirationDateSelected = new JLabel("Expire Time: " + spikeTrader.getExpirationDate());
    recalibrateSelected = new JLabel("Recalibrate: " + (spikeTrader.recalibratorEnabled() ? "Until " + spikeTrader.getRecalibrateUntil() : "N/A"));
    info.add(currencySelected);
    info.add(eventDateSelected);
    info.add(accountUtilizationSelected);
    info.add(autoStartDateSelected);
    info.add(expirationDateSelected);
    info.add(recalibrateSelected);
    addComponent(this, info, 1, 1);
    currencySubscribe = new JButton("Subscribe to " + Arrays.toString(spikeTrader.getCurrencies()) + " Pairs");
    unsubscribeAll = new JButton("Unsubscribe all Pairs");
    updateCalculated = new JButton("Update Calculated Values");
    recalibrateOrders = new JButton("Recalibrate Orders");
    currencySubscribe.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            spikeTrader.subscribeCurrency();
        }
    });
    unsubscribeAll.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            spikeTrader.unsubscribeAll();
        }
    });
    updateCalculated.addActionListener(new UpdateCalculated());
    recalibrateOrders.addActionListener((new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            spikeTrader.recalibrateAllOrders();
        }
    }));
    setup.add(currencySubscribe);
    setup.add(unsubscribeAll);
    setup.add(updateCalculated);
    setup.add(recalibrateOrders);
    addComponent(this, setup, 1, 3);
    //		pairsDataModel = new DefaultTableModel(new String[]{"Pair" ,"Buy Min", "Buy Max", "Buy Diff",
    //					"Sell Min", "Sell Max", "Sell Diff", "Slope", "Std Dev"},
    //					spikeTrader.getPairs().size());
    //		pairsData = new JTable(pairsDataModel);
    //		pairsData.setValueAt("test", 0, 0);
    //		data.add(pairsData);
    //		addComponent(this, data, 1, 2);
    inputs.add(new JLabel("Pair"));
    inputs.add(new JLabel("Amount (1K Lots)"));
    inputs.add(new JLabel("Spike Buffer"));
    inputs.add(new JLabel("Stop Buffer"));
    orderInputs = new HashMap<String, JTextField[]>();
    for (String pair : spikeTrader.getPairs()) {
        inputs.add(new JLabel(pair + ":"));
        //Integer[] calculated = spikeTrader.getParams().get(pair);
        JTextField amount = new JTextField();
        JTextField spikeBuffer = new JTextField();
        JTextField stopBuffer = new JTextField();
        amount.getDocument().addDocumentListener(new InputValueChangeListener());
        spikeBuffer.getDocument().addDocumentListener(new InputValueChangeListener());
        stopBuffer.getDocument().addDocumentListener(new InputValueChangeListener());
        inputs.add(amount);
        inputs.add(spikeBuffer);
        inputs.add(stopBuffer);
        orderInputs.put(pair, new JTextField[] { amount, spikeBuffer, stopBuffer });
    }
    inputs.add(new JLabel("Defaults:"));
    defAmount = new JTextField();
    defSpikeBuffer = new JTextField();
    defStopBuffer = new JTextField();
    inputs.add(defAmount);
    inputs.add(defSpikeBuffer);
    inputs.add(defStopBuffer);
    addComponent(this, inputs, 2, 1);
    placeOrders = new JButton("Place Orders");
    cancelOrders = new JButton("Cancel Orders");
    saveParams = new JButton("Save Parameters");
    actions.add(saveParams);
    actions.add(placeOrders);
    actions.add(cancelOrders);
    addComponent(this, actions, 2, 2);
    placeOrders.setEnabled(false);
    //cancelOrders.setEnabled(false);
    saveParams.addActionListener(new SetInputsListener());
    placeOrders.addActionListener(new StartListener());
    cancelOrders.addActionListener(new StopListener());
    this.setVisible(true);
}

[Buggy Hunk]
saveParams.addActionListener(new SetInputsListener());

[Patch]
saveParams.addActionListener(new SaveInputsListener());