/* * Catroid: An on-device visual programming system for Android devices * Copyright (C) 2010-2016 The Catrobat Team * (<http://developer.catrobat.org/credits>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * An additional term exception under section 7 of the GNU Affero * General Public License, version 3, is available at * http://developer.catrobat.org/license_additional_term * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.catrobat.catroid.ui.dialogs; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.util.Log; import org.catrobat.catroid.R; import org.catrobat.catroid.devices.mindstorms.ev3.sensors.EV3Sensor; import org.catrobat.catroid.devices.mindstorms.nxt.sensors.NXTSensor; import org.catrobat.catroid.ui.SettingsActivity; public class LegoSensorPortConfigDialog extends DialogFragment { public static final String DIALOG_FRAGMENT_TAG = "dialog_lego_sensor_port_config"; public static final String TAG = LegoSensorPortConfigDialog.class.getSimpleName(); public enum Lego { NXT, EV3 } private int clickedItem = 0; private Lego legoType; private String legoTypeString; private String title; private NXTSensor.Sensor nxtSensor; private EV3Sensor.Sensor ev3Sensor; public LegoSensorPortConfigDialog(int clickedResItem, Lego type) { clickedItem = clickedResItem; legoType = type; legoTypeString = type == Lego.NXT ? "NXT" : "EV3"; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { String[] portStrings; final String[] sensorMappingStrings; String[] sensorMappings; Dialog dialog; if (legoType == Lego.NXT) { final NXTSensor.Sensor[] sensorMapping = SettingsActivity.getLegoMindstormsNXTSensorMapping(this.getActivity()); sensorMappingStrings = getResources().getStringArray(R.array.nxt_sensor_chooser); portStrings = getResources().getStringArray(R.array.port_chooser); sensorMappings = new String[portStrings.length]; for (int index = 0; index < sensorMappings.length; index++) { sensorMappings[index] = portStrings[index] + ": " + sensorMappingStrings[sensorMapping[index].ordinal()]; } getAttributes(clickedItem, legoType); dialog = new AlertDialog.Builder(getActivity()) .setTitle(title) .setItems(sensorMappings, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { checkIfOverwrite(which, sensorMappingStrings[sensorMapping[which].ordinal()], legoType); } }).create(); dialog.setCanceledOnTouchOutside(true); } else { final EV3Sensor.Sensor[] sensorMapping = SettingsActivity.getLegoMindstormsEV3SensorMapping(this.getActivity()); sensorMappingStrings = getResources().getStringArray(R.array.ev3_sensor_chooser); portStrings = getResources().getStringArray(R.array.port_chooser); sensorMappings = new String[portStrings.length]; for (int index = 0; index < sensorMappings.length; index++) { sensorMappings[index] = portStrings[index] + ": " + sensorMappingStrings[sensorMapping[index].ordinal()]; } getAttributes(clickedItem, legoType); dialog = new AlertDialog.Builder(getActivity()) .setTitle(title) .setItems(sensorMappings, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { checkIfOverwrite(which, sensorMappingStrings[sensorMapping[which].ordinal()], legoType); } }).create(); dialog.setCanceledOnTouchOutside(true); } return dialog; } private void getAttributes(int clickedItem, Lego type) { if (type == Lego.NXT) { switch (clickedItem) { case R.string.formula_editor_sensor_lego_nxt_touch: title = getString(R.string.nxt_sensor_touch); nxtSensor = NXTSensor.Sensor.TOUCH; break; case R.string.formula_editor_sensor_lego_nxt_sound: title = getString(R.string.nxt_sensor_sound); nxtSensor = NXTSensor.Sensor.SOUND; break; case R.string.formula_editor_sensor_lego_nxt_light: title = getString(R.string.nxt_sensor_light); nxtSensor = NXTSensor.Sensor.LIGHT_INACTIVE; break; case R.string.formula_editor_sensor_lego_nxt_light_active: title = getString(R.string.nxt_sensor_light_active); nxtSensor = NXTSensor.Sensor.LIGHT_ACTIVE; break; case R.string.formula_editor_sensor_lego_nxt_ultrasonic: title = getString(R.string.nxt_sensor_ultrasonic); nxtSensor = NXTSensor.Sensor.ULTRASONIC; break; default: title = getString(R.string.nxt_sensor_not_found); nxtSensor = NXTSensor.Sensor.NO_SENSOR; } } else { switch (clickedItem) { case R.string.formula_editor_sensor_lego_ev3_sensor_touch: title = getString(R.string.ev3_sensor_touch); ev3Sensor = EV3Sensor.Sensor.TOUCH; break; case R.string.formula_editor_sensor_lego_ev3_sensor_infrared: title = getString(R.string.ev3_sensor_infrared); ev3Sensor = EV3Sensor.Sensor.INFRARED; break; case R.string.formula_editor_sensor_lego_ev3_sensor_color: title = getString(R.string.ev3_sensor_color); ev3Sensor = EV3Sensor.Sensor.COLOR; break; case R.string.formula_editor_sensor_lego_ev3_sensor_color_ambient: title = getString(R.string.ev3_sensor_color_ambient); ev3Sensor = EV3Sensor.Sensor.COLOR_AMBIENT; break; case R.string.formula_editor_sensor_lego_ev3_sensor_color_reflected: title = getString(R.string.ev3_sensor_color_reflected); ev3Sensor = EV3Sensor.Sensor.COLOR_REFLECT; break; default: title = getString(R.string.nxt_sensor_not_found); ev3Sensor = EV3Sensor.Sensor.NO_SENSOR; } } } private void checkIfOverwrite(final int selectedPort, String selected, final Lego legoType) { final Context dialogueContext = getActivity(); if (selected.equals(getString(R.string.nxt_no_sensor))) { // nxt_no_sensor equals ev3_no_sensor overwrite(dialogueContext, selectedPort, legoType); } else if (!selected.equals(title)) { AlertDialog.Builder builder = new CustomAlertDialogBuilder(dialogueContext); builder.setTitle(R.string.lego_nxt_overwrite_sensor_port_dialog_title) .setMessage(R.string.lego_nxt_overwrite_sensor_port_dialog_message) .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String sensor = legoType == Lego.NXT ? SettingsActivity.NXT_SENSORS[selectedPort] : SettingsActivity.EV3_SENSORS[selectedPort]; if (dialogueContext != null) { if (legoType == Lego.NXT) { SettingsActivity.setLegoMindstormsNXTSensorMapping(dialogueContext, nxtSensor, sensor); } else { SettingsActivity.setLegoMindstormsEV3SensorMapping(dialogueContext, ev3Sensor, sensor); } } else { Log.e(TAG, "Context == null :("); } } }).create().show(); } getTargetFragment().onActivityResult(getTargetRequestCode(), selectedPort, getActivity().getIntent().setType(legoTypeString)); } private void overwrite(Context context, int selectedPort, Lego legoType) { String sensor = legoType == Lego.NXT ? SettingsActivity.NXT_SENSORS[selectedPort] : SettingsActivity.EV3_SENSORS[selectedPort]; if (getActivity() != null) { if (legoType == Lego.NXT) { SettingsActivity.setLegoMindstormsNXTSensorMapping(context, nxtSensor, sensor); } else { SettingsActivity.setLegoMindstormsEV3SensorMapping(context, ev3Sensor, sensor); } } else { Log.e(TAG, "Context == null :("); } } }